一、业务背景
系统的单据都有标准的引入功能,但是引入模板似乎有点复杂,好不容易整理好了引入表格,引入的时候还会遇到各种未知的报错,对于引入数据的操作就不是太友好了,特别是本身就有一个数据清晰的表格,还要整理成系统的引入模板,就更心累了。
于是,就有很多二开需求出现了,用户要求按照他们现成的表格,开发自定义的引入功能,例如,将某平台的订单数据导入到系统的销售订单、将某收银平台的收款数据,导入到收款单...等等。
放到二开实现这个层面来讲,无非就是上传表格,读取表格数据,按照表格的格式读取需要的字段,然后生成单据。
插件生成单据的开发参考:金蝶云星空 如何使用插件生成单据
字段不同、表格格式不同、单据字段结构不同、再加上后期字段调整、功能维护...那也比较心累了
于是,我就想着能不能开发一个“万能的Excel导入功能”,以你的表格为准,尽可能的不让你整理表格格式,只需要在系统里面做一个表格字段引入规则,然后就能实现各种表格的导入。
“就像单据转换一样,Excel下推单据” 那么,开干!
二、解决方案
Excel引入方案:首先,我们开发一个基础资料,Excel引入方案,来配置Excel引入规则
那么,引入规则涉及哪些内容呢?
①首先Excel数据范围,支持按行序号类限定引入范围,也支持设置自定义条件表达式来自动判断结束行。
还有分单设置,一个Excel表导入可能会生成多个单据。
②然后是字段映射,选择单据上需要引入的字段,然后配置对应Excel哪个字段
通过单据元数据解析来实现字段加载单据字段, 单独开发一个动态表单来作为字段选择窗口。
③对于不太规则的Excel表格,可能还有一些特殊表头信息,直接对应的表头字段,设置精确的行、列坐标来对应。
后面可以逐步完善,再加入过滤条件配置、汇总引入配置...
外部数据导入: Excel引入方案有了,我们就来实现解析引入方案,完成单据引入生成单据
①首先要开发一个公共的动态表单界面:外部数据导入
②选择要使用的引入方案
③再添加一个文件上传的控件,用来上传Excel表格,这是必须的!
④再加一些自定义参数设置:引入单据状态、引入失败自动暂存...等等
⑤这样大批量的数据处理,当然少不了进度条的使用,引入操作就更友好啦!
随便做一个Excel表引入测试一下:
三、关键实现代码简析
本案例全部采用Python插件实现,用C#当然也是可以实现的,个人更习惯用Python,更方便快速维护迭代。
Excel引入方案,就是一个普通的基础资料开发,需要插件处理的核心就是单据字段选择,解析单据的元数据来实现就可以了,社区相关的资料很多,代码比较常规,这里就不做过多分享!
下面主要看下从解析引入方案->导入数据生成单据的过程中,有一些关键代码可以分享一下。
上传Excel表,读取Excel表的数据,写入数据库临时表
本案例实现方式是把Excel表数据完全引入后,根据设置的数据范围筛序出需要的数据,然后构造新的DataTable,
然后,将DataTable写入临时待用!
注意:上传的临时文件,读取完数据或,应该自动及时删除,以免服务器上留下一些不必要的垃圾文件!
①Excel文件上传
②Excel文件完全读取,获得DataSet(根据ExcelSheet生成的多个DataTable集合)
然后进一步获取第一个页签的DataTable,本案例默认只读取第一个Sheet
③解析读取到的Excel原始DataTable,读取临时表时可解析结束条件表达式作为判断结束条件
---------------------------------------------------------------------------------------------------------------------------
④然后根据数据范围重新创建新的DataTable后写入数据库临时表
根据临时表中的数据创建单据
本案例创建单据的方式是构造单据的视图View,根据字段映射配置,模拟人工录入单据的过程构造单据数据包。
①构造单据视图View,创建一个单据的新增View,模拟打开单据新增界面
②自动判断字段类型,对单据数据包的字段进行赋值
-----------------------------------------------------------------------------------------------------------------------
创建好所有的单据数据包之后,调用Save方法,生成单据,并弹出保存结果,完事!
如果需要自动审核或者暂存的单据,也自动调用对应的方法处理
四、总结几点
本案例创建单据的方式是构造单据的视图View,模拟人工录入单据的过程对字段赋值。
有以下几个优点:
I.自动判断字段类型,自动采用合适的赋值方式,基础资料/辅助资料可按编码或者内码ID赋值,枚举可按枚举名称或者枚举值赋值,可以在引入方案中针对字段设置,上面的截图中已经体现出来了。
II.字段赋值可以自动触发值更新事件和实体服务规则,可以自动携带或者计算出来的字段,都不需要引入,只需要引入手动录入单据时,要人工录入的字段即可创建单据,大大降低Excel的复杂程度。
III.支持维度关联字段引入(仓位、辅助属性、核算维度),并且可以自动判断维度值类型,如果是资料类型,则按资料字段的设置配置字段映射即可。所以配置字段映射时,需要设置赋值顺序!
本案例可作为一个通用的Excel数据导入工具,标准引入功能用起来不太顺畅的时候,可采用此工具导入数据。
本案例可适用于,将外部系统或外部Excel数据引入系统,与系统已有单据流程,开发报表分析。
这个工具主要是为了尽可能实现减少用户整理Excel表格模板的工作量,尽量达到"现有表格"拿来就能导入的效果。
案例中用Python插件实现了创建单据方法,有二开场景需要通过插件自动生成单据也可复用这部分代码。
这个案例开发抛砖引玉,基于这个案例开发的经验,可延展功能:引入单据关联关系、引入数据到单据体...等等。
==============================正文结束=====================================
感谢大家的关注与评阅,希望这个案例能为大家的实际问题带来参考和启发。
此方案全部用Python插件实现,如果需要此方案的二开补丁或者源码,可私信作者!
发布于 金蝶云星空BOS开发交流圈 社群
推荐阅读