金蝶云二开引入excel的方法
需求背景:
部分单据的单据体数据行非常多,在单据维护界面录入效率不高,需要在Excel中录入后导入
技术难点:
1. 如何上传文件?
2. 如何读取上传的Excel文件?
案例设计:
此案例,需要包含两个界面,一个是需要引入单据体的单据A,另外一个,是用于上传文件的动态表单B。
在单据A上:
1. 增加一个菜单,引入单据体;
2. 用户点击引入单据体菜单后,弹出一个新窗口(文件上传动态表单B),供用户上传Excel文件
3. 确定文件上传完毕,调用第三方工具,读取Excel内容为DataSet对象
4. 把DataSet中的数据,逐行、逐字段,填写到单据体中
文件上传动态表单B:
1. 添加一个文件上传控件,设置文件后缀,必须为*.xls
2. 添加确定、取消两个按钮
3. 默认情况下,确定按钮时锁定的,只有上传文件完毕,才解锁
效果示意:
图一:在单据上增加引入单据体菜单
图二:文件上传界面
图三:待引入的单据体数据
示例代码:
//*************************************************************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Data;
using Kingdee.BOS;
using Kingdee.BOS.Util;
using Kingdee.BOS.JSON;
using Kingdee.BOS.Core;
using Kingdee.BOS.Core.DynamicForm;
using Kingdee.BOS.Core.DynamicForm.PlugIn;
using Kingdee.BOS.Core.DynamicForm.PlugIn.Args;
using Kingdee.BOS.Core.Bill;
using Kingdee.BOS.Core.Bill.PlugIn;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.FieldElement;
using Kingdee.BOS.ServiceHelper.Excel;
namespace JDSample.FormPlugIn.Bill
{
/// <summary>
/// 引入单据体
/// </summary>
[Description("引入单据体")]
public class S151209ImportEntryEdit : AbstractBillPlugIn
{
/// <summary>
/// 菜单点击事件
/// </summary>
/// <param name="e"></param>
public override void AfterBarItemClick(AfterBarItemClickEventArgs e)
{
if (e.BarItemKey.EqualsIgnoreCase("tb_JD_ImportEntry"))
{
// 显示文件上传界面,上传Excel文件
DynamicFormShowParameter showParam = new DynamicFormShowParameter();
showParam.FormId = "a6fe71c4beda4f7baf60411c4b5f3b3e";
this.View.ShowForm(showParam,
new Action<FormResult>((formResult) =>
{
if (formResult != null && formResult.ReturnData != null)
{
string fullFileName = formResult.ReturnData.ToString();
this.DoImportEntry(fullFileName);
}
}));
}
}
/// <summary>
/// 开始导入单据体
/// </summary>
/// <param name="fullFileName">Excel文件</param>
/// <remarks>
/// 特别说明:此函数仅演示如何把Excel转换为DataSet,
/// 并读取DataSet内容,填写到单据体,
/// 未进行任何的安全处理,实际生产环境,需要对数据的合法性进行严格的判断
/// </remarks>
private void DoImportEntry(string fullFileName)
{
using (ExcelOperation helper = new ExcelOperation(this.View))
{
// 利用ExcelOperation对象,把xml文件,转为DataSet对象
// 参数说明:
// filePath : 完整的文件名,包含了物理目录
// dataStartIndex : 数据开始行索引,从0开始。通常第一行为标题,第二行开始为数据行
// colNameIndex : 列名所在行索引,从0开始。如此参数为0,表明第一行为列名行
DataSet ds = helper.ReadFromFile(fullFileName, 1, 0);
// 取第一个表格中的数据导入
DataTable dt = ds.Tables[0];
int rowIndex = this.Model.GetEntryRowCount("FEntity");
foreach (DataRow dataRow in dt.Rows)
{
// 单据体增加新行,并更新行索引
this.Model.CreateNewEntryRow("FEntity");
this.Model.SetEntryCurrentRowIndex("FEntity",rowIndex);
// 设置基础资料字段值
this.Model.SetItemValueByNumber(
"F_JD_MaterialId", Convert.ToString(dataRow["物料编码"]), rowIndex);
// 设置普通字段值
this.Model.SetValue("F_JD_Qty", dataRow["数量"], rowIndex);
// TODO : 设置其他字段值,此处略
rowIndex++;
}
}
}
}
/// <summary>
/// 上传单据体数据文件
/// </summary>
/// <remarks>
/// 界面说明:
/// 1. 添加一个文件上传控件,设置文件后缀,必须为*.xls
/// 2. 添加确定、取消两个按钮
/// 3. 默认情况下,确定按钮时锁定的,只有上传文件完毕,才解锁
/// </remarks>
[Description("上传单据体数据文件")]
public class S151209ImportFileUpdateEdit : AbstractDynamicFormPlugIn
{
/// <summary>
/// 上传上来的文件名:完整的文件名,包含了物理路径
/// </summary>
private string _fullFileName = string.Empty;
public override void AfterBindData(EventArgs e)
{
this.View.GetControl("F_JD_BTNOK").Enabled = false;
}
/// <summary>
/// 文件上传完毕,触发此事件:通过此事件获取上传上来的文件名
/// </summary>
/// <param name="e"></param>
public override void CustomEvents(CustomEventsArgs e)
{
if (e.Key.EqualsIgnoreCase("F_JD_FileUpdate"))
{
this.View.GetControl("F_JD_FileUpdate").SetCustomPropertyValue("NeedCallback", true);
this.View.GetControl("F_JD_FileUpdate").SetCustomPropertyValue("IsRequesting", false);
if (e.EventName.EqualsIgnoreCase("FileChanged"))
{// 文件上传完毕
// 取文件上传参数,文件名
JSONObject uploadInfo = KDObjectConverter.DeserializeObject<JSONObject>(e.EventArgs);
if (uploadInfo != null)
{
JSONArray json = new JSONArray(uploadInfo["NewValue"].ToString());
if (json.Count > 0)
{
// 取上传的文件名
string fileName = (json[0] as Dictionary<string, object>)["ServerFileName"].ToString();
this._fullFileName = this.GetFullFileName(fileName);
// 解锁确定按钮
this.View.GetControl("F_JD_BTNOK").Enabled = true;
}
else
{
// 锁定确定按钮
this.View.GetControl("F_JD_BTNOK").Enabled = false;
}
}
}
}
}
/// <summary>
/// 按钮点击事件
/// </summary>
/// <param name="e"></param>
public override void ButtonClick(ButtonClickEventArgs e)
{
if (e.Key.EqualsIgnoreCase("F_JD_BTNOK"))
{// 确定
this.View.ReturnToParentWindow(new FormResult(this._fullFileName));
this.View.Close();
}
else if (e.Key.EqualsIgnoreCase("F_JD_BTNCancel"))
{// 取消
this.View.Close();
}
}
/// <summary>
/// 产生完整的文件名,包含了物理路径
/// </summary>
/// <param name="fileName"></param>
/// <returns></returns>
private string GetFullFileName(string fileName)
{
string dir = "FileUpLoadServices\\UploadFiles";
return PathUtils.GetPhysicalPath(dir, fileName);
}
}
}
金蝶云二开引入excel的方法相关推荐
- 金蝶K3Wise二开常用数据库表
一.单据基础模板 1.ICTransactionType:该表反映了供需链所有单据的总体情况. 2.ICClassType:单据类别表 3.ICTemplate:该表反映了所有单据的表头的详细情况. ...
- 泛微E9二次开发,对接金蝶云星空,数据同步,表单同步。
文章目录 泛微E9二次开发,对接金蝶云星空 一.搭建开发环境,引入相关依赖 一.创建项目 二.配置javaSDK 三.配置项目依赖 四.编写测试代码 五.配置编译 六.resin远程debug配置 二 ...
- 怎么使用win7计算机开方,Excel开方如何计算,excel开n次方的方法
Excel开方如何计算,excel开n次方的方法,excel中平方根和立方根的开方公式还比较好记住,但是excel开n次方的怎么实现的,今天就给大家汇总一下excel开方的几种情况. Excel开方之 ...
- 金蝶二开凭证生成反写二开单据凭证号
金蝶二开凭证生成反写二开单据凭证号 /*** 凭证生成时反写凭证号*/@Overridepublic void reverseSave(Context ctx, IObjectPK srcBillPK ...
- 解忧云SMS短信服务平台系统 短信发送系统源码 全解密随时可以二开无后门
解忧云SMS短信服务平台系统 短信发送系统 全解密完美版 经过一系列修复现在程序已经可以完全使用. 并且是全解密随时可以二开.无后门. 一些bug已经完全修复 安装教程 数据库配置文件路径 .env ...
- 微信小程序:二开版优化新紫色UI云开发新款壁纸小程序源码
这是一款由旧版https://airymz.com/3387.html进行优化二开的一个新版本 本壁纸表情包头像小程序采用(dcloud云开发)所以无需服务器与域名 无需服务器.无需域名.云开发直接上 ...
- 二开版优化新紫色UI云开发新款壁纸小程序源码支持用户投稿在线审核
本壁纸表情包头像小程序采用(dcloud云开发)所以无需服务器与域名 无需服务器.无需域名.云开发直接上线 特点:支持用户投稿,后台审核后会发订阅消息给用户提示作品审核状态,增加用户粘性,支持后端修改 ...
- 金蝶云星空二维码整体解决方案 金蝶云星空条码管理系统 金蝶ERP移动解决方案 金蝶云星空条码扫描 金蝶云星空WMS仓库移动扫码 金蝶安卓PDA扫码方案 金蝶云星空出入库盘点出货条码扫码 提供源码
本人在ERP实施公司做顾问四五年,参与企业实施ERP十多个项目,非常熟悉企业ERP流程,在实施过程遇到众多问题,提出了不少根据企业具体情况的解决方案. 最近定制开发了一套适合企业的条 ...
- 点云配准(二)— python open3d ICP方法
上一节中介绍了点云配准的基础知识.本节将采用python open3d来进行点云配准. open3d安装和点云配准介绍,请参考: Open3d读写ply点云文件_Coding的叶子的博客-CSDN博客 ...
最新文章
- C#面向对象(四)虚方法实现多态
- 瀑布模型(经典的生命周期模型)
- centos7 无法启动网络(service network restart)错误解决办法
- 统计学习笔记(3)——k近邻法与kd树
- 缺失的第一个正数—leetcode41
- xstream 数字映射不上去_6个做端口映射的步骤,外网访问内网,菜鸟也能做?
- Confluence 6 配置服务器基础地址备注
- jenkins java反序列化_Jenkins “Java 反序列化”过程远程命令执行漏洞
- 数据结构(一)线性表
- web相关基础知识1
- labview自动生成html,使用LabVIEW实现网页数据提取及交互.pptx
- 红橙Darren视频笔记 View事件分发源码分析 基于API29
- python django 动态网页_python27+django1.9创建app的视图及实现动态页面
- commons-logging中无法寻找log4j
- 基本的阿里云Linux服务器设置
- 景观生态学概述[转载]
- iOS 绝对值方法
- android.mk 依赖关系,Android NDK学习(二):编译脚本语法Android.mk和Application.mk
- win7读取linux硬盘序列号,Windows 下获取硬盘序列号
- hpbios刷新工具_刷新:不会破产的工具
热门文章
- 20秋C语言在线作业1,地大20秋《C语言程序设计(新)》在线作业一资料
- 小白快速上手前后端分离项目开发教程(springboot+vue)
- Software MyZone(http://www.firedragonpzy.com.cn)
- 用python写一个豆瓣短评通用爬虫(登录、爬取、可视化)!
- 基于SSH的医院挂号预约系统(MySQL版)
- 计算机故障英语,用英语表达电脑故障上-职场英语口语必备
- php三级分销无法绑定佣金,2018最新三级分销佣金比例设置方案
- python爬虫小知识: 通过 request库 代理proxies来设置,无法访问问题
- c# 时间格式化为英文_C# 时间格式 转 为英文
- 国产电容式触控IC的工作原理及应用