#实践案例#Python插件实现Excel表万能导入云星空原创
金蝶云社区-CQ周玉立
CQ周玉立
135人赞赏了该文章 1331次浏览 未经作者许可,禁止转载编辑于2024年05月17日 18:26:16
封面

一、业务背景

        系统的单据都有标准的引入功能,但是引入模板似乎有点复杂,好不容易整理好了引入表格,引入的时候还会遇到各种未知的报错,对于引入数据的操作就不是太友好了,特别是本身就有一个数据清晰的表格,还要整理成系统的引入模板,就更心累了。

        于是,就有很多二开需求出现了,用户要求按照他们现成的表格,开发自定义的引入功能,例如,将某平台的订单数据导入到系统的销售订单、将某收银平台的收款数据,导入到收款单...等等。

        放到二开实现这个层面来讲,无非就是上传表格,读取表格数据,按照表格的格式读取需要的字段,然后生成单据。

        字段不同、表格格式不同、单据字段结构不同、再加上后期字段调整、功能维护...那也比较心累了

        于是,我就想着能不能开发一个“万能的Excel导入功能”,以你的表格为准,尽可能的不让你整理表格格式,只需要在系统里面做一个表格字段引入规则,然后就能实现各种表格的导入。

        “就像单据转换一样,Excel下推单据” 那么,开干!

二、解决方案

  •     Excel引入方案:首先,我们开发一个基础资料,Excel引入方案,来配置Excel引入规则

         那么,引入规则涉及哪些内容呢?

           ①首先Excel数据范围,支持按行序号类限定引入范围,也支持设置自定义条件表达式来自动判断结束行。

             还有分单设置,一个Excel表导入可能会生成多个单据。

image.png


           ②然后是字段映射,选择单据上需要引入的字段,然后配置对应Excel哪个字段

            通过单据元数据解析来实现字段加载单据字段, 单独开发一个动态表单来作为字段选择窗口。

image.png

image.png

           ③对于不太规则的Excel表格,可能还有一些特殊表头信息,直接对应的表头字段,设置精确的行、列坐标来对应。

image.png

后面可以逐步完善,再加入过滤条件配置、汇总引入配置...

  •    外部数据导入: Excel引入方案有了,我们就来实现解析引入方案,完成单据引入生成单据

          ①首先要开发一个公共的动态表单界面:外部数据导入

          ②选择要使用的引入方案

          ③再添加一个文件上传的控件,用来上传Excel表格,这是必须的!

          ④再加一些自定义参数设置:引入单据状态、引入失败自动暂存...等等

          ⑤这样大批量的数据处理,当然少不了进度条的使用,引入操作就更友好啦!

随便做一个Excel表引入测试一下:

image.png

image.png

image.png

三、关键实现代码简析

        本案例全部采用Python插件实现,用C#当然也是可以实现的,个人更习惯用Python,更方便快速维护迭代。

        Excel引入方案,就是一个普通的基础资料开发,需要插件处理的核心就是单据字段选择,解析单据的元数据来实现就可以了,社区相关的资料很多,代码比较常规,这里就不做过多分享!

        下面主要看下从解析引入方案->导入数据生成单据的过程中,有一些关键代码可以分享一下。

  • 上传Excel表,读取Excel表的数据,写入数据库临时表

    本案例实现方式是把Excel表数据完全引入后,根据设置的数据范围筛序出需要的数据,然后构造新的DataTable,

    然后,将DataTable写入临时待用!

注意:上传的临时文件,读取完数据或,应该自动及时删除,以免服务器上留下一些不必要的垃圾文件!

①Excel文件上传

image.png

②Excel文件完全读取,获得DataSet(根据ExcelSheet生成的多个DataTable集合)

然后进一步获取第一个页签的DataTable,本案例默认只读取第一个Sheet

image.png

③解析读取到的Excel原始DataTable,读取临时表时可解析结束条件表达式作为判断结束条件

image.png

---------------------------------------------------------------------------------------------------------------------------image.png

然后根据数据范围重新创建新的DataTable后写入数据库临时表

image.png

  • 根据临时表中的数据创建单据

本案例创建单据的方式是构造单据的视图View,根据字段映射配置,模拟人工录入单据的过程构造单据数据包。

①构造单据视图View,创建一个单据的新增View,模拟打开单据新增界面

image.png

②自动判断字段类型,对单据数据包的字段进行赋值

image.png

-----------------------------------------------------------------------------------------------------------------------

image.png

  • 创建好所有的单据数据包之后,调用Save方法,生成单据,并弹出保存结果,完事!

    如果需要自动审核或者暂存的单据,也自动调用对应的方法处理

image.png

四、总结几点

  • 本案例创建单据的方式是构造单据的视图View,模拟人工录入单据的过程对字段赋值。

    有以下几个优点:

            I.自动判断字段类型,自动采用合适的赋值方式,基础资料/辅助资料可按编码或者内码ID赋值,枚举可按枚举名称或者枚举值赋值,可以在引入方案中针对字段设置,上面的截图中已经体现出来了。

            II.字段赋值可以自动触发值更新事件和实体服务规则,可以自动携带或者计算出来的字段,都不需要引入,只需要引入手动录入单据时,要人工录入的字段即可创建单据,大大降低Excel的复杂程度。

            III.支持维度关联字段引入(仓位、辅助属性、核算维度),并且可以自动判断维度值类型,如果是资料类型,则按资料字段的设置配置字段映射即可。所以配置字段映射时,需要设置赋值顺序!

  • 本案例可作为一个通用的Excel数据导入工具,标准引入功能用起来不太顺畅的时候,可采用此工具导入数据。

  • 本案例可适用于,将外部系统或外部Excel数据引入系统,与系统已有单据流程,开发报表分析。

  • 这个工具主要是为了尽可能实现减少用户整理Excel表格模板的工作量,尽量达到"现有表格"拿来就能导入的效果。

  • 案例中用Python插件实现了创建单据方法,有二开场景需要通过插件自动生成单据也可复用这部分代码。

  • 这个案例开发抛砖引玉,基于这个案例开发的经验,可延展功能:引入单据关联关系、引入数据到单据体...等等。

==============================正文结束=====================================

感谢大家的关注与评阅,希望这个案例能为大家的实际问题带来参考和启发。

此方案全部用Python插件实现,如果需要此方案的二开补丁或者源码,可私信作者!



发布于 金蝶云星空BOS开发交流圈 社群

赞 135