一、前言
企业在发展的过程中会使用各种各样的系统,其中很多系统用了5-10年,我们称之为遗留系统存在诸多风险:维护耗时、中断频繁、用户不友好、与新软件的兼容性问题等。总有一天,这些庞大的问题会垄断IT资源,使数字化转型过程变得更加复杂。同时我们也发现,很多企业的流程和业务场景还停留在线下使用各种office工具,没有落实到系统上。
现在解决现代化的遗留问题有一条捷径。低代码是一种可视化开发方法,可帮助组织构建自定义应用程序以补充或替换遗留系统。低代码平台通过提供各种编码技能水平的人都可以构建可随组织扩展和发展的关键业务应用程序的环境来快速跟踪开发。替换遗留系统或者将线下流程和场景迁移到线上,我们都可以称之为应用现代化。企业实现应用现代化是一项长期的任重道远的工作,后续我们会陆续发布关于应用现代化的文章,来看如何帮助企业实现应用现代化。
回到我们今天的主题,首先请大家思考一个问题,企业员工在日常工作中使用的最多的工具是什么?没错就是Excel,在日常工作中,Excel确实必不可少,在很多场景下都非常适合,但是Excel的过度使用也会带来各种问题。
二、需求分析
首先,我们来看一下下面的两个项目需求:
1.某汽车零配件工厂,Planner每周会去用Excel填报基于个人负责的物料的一整年的预测数量,以每个月为单位填报,填报销售预测的数量,工厂预计生产的数量,工厂预计发货的数量,财务审核的数量。填报完成之后,会根据物料的单价,汇率进行价格计算,同时根据不同的BU包括不同的产品线,不同产品线包括不同的Group,不同的Group包含不同的人员和物料,按照这样的层级关系,计算出BU,产品线,Group负责的物料的价格情况,同时会与上周,上上周的数据进行比较,如果发现某个月的数据以上周或上上周相比,差距比较多,需要报异常,提醒Planner做出备注。
同时管理层希望能随时灵活的查看各个BU,产品线,Group相关的数据。
管理员也需要定期从SAP导出基础数据,比如组织架构关系,成本数据,汇率等需要后续计算用到的数据,这些导出的数据都是以Excel的方式。
2.某电子厂商,工厂员工需要每天去用Excel填报工时,填报工时完成后上传,无论填报多少数据,只基于最后一行数据进行创建,并且创建的数据会去SAP查找是否匹配,如果不匹配则反馈需要修改数据,如果匹配则更新数据,更新数据时,首先基于产品号去查看是否已有数据,如果没有则新建数据,如果有则更新数据,并绑定上传的Excel到当前数据。其他旧的Excel则保存在服务器上。
报表查看不同的产品号的工时数据,且显示的工时数据都是最新数据,同时显示最新上传的相关的Excel,可以一键下载。
从上面两个项目需求我们可以看出有很多类似的地方,首先并没有改变普通员工的工作方式,无论是Planner还是工厂员工还是会通过Excel填报数据,只是在填报数据之后,会有非常多的计算和逻辑需要处理,如果这时还通过Excel的方式去做,我们可以看到在Case1里需要多个Excel表的数据进行合并计算,非常容易出错,其次每周填报数据就要计算,工作量非常大,且不易于版本管理,当发现计算错误后,也非常难去追溯。要注意,没有会有非常多的Planner和工厂员工去填报数据,再用Excel来实现后面的业务场景,这样的人力消耗是巨大的。
其次两个项目都有管理层查看报表的需求,而管理层更加希望能随时随地通过各种终端查看想要看到的数据,这也是通过Excel是无法满足的。
现在这两个需求,可以通过Mendix非常快速的实现,实现的整个过程不在我们本次讨论的范围,本次我们重点介绍如何通过Excel导入组件,将线下流程完美地迁移到线上。
三、Excel导入组件
组件下载
在Mendix Marketplace中输入Excel查找,找到Excel importer组件下载
找到Model Reflection 组件下载,为了配置 Excel 列和域模型之间的映射
找到Community Commons Function Library组件安装,以确保可以导入 BigDecimal 值
下载这几个模块后,都可以在Marketplace module下找到。
导入模块后,将Templates_Overview或ExcelImporter.ExcelImportOverview页面配置到导航栏。这是定义 Excel 映射的起点。
在我们正式开始之前先了解下Excel模板的各种定义,这有助于我们后续根据不同的业务场景来做配置。https://docs.mendix.com/appstore/modules/excel-importer/#413-header-row-nr
下面我们来开始如何导入一个Excel
导入 Excel 文档
1 简介
向应用程序添加大量数据(例如,引用数据或来自外部应用程序的数据)可能非常耗时。为了节省时间和精力,可以使用Excel导入组件来实现。在此操作指南中,将设置导入模板并使用此模块将数据导入应用程序。
2 先决条件
在开始此操作方法之前,请确保知道如何执行以下操作:
- 创建领域模型(见配置领域模型)
- 创建概述和详细信息页面(请参阅如何创建前两个概述和详细信息页面)
- 创建导航栏(请参阅设置导航)
- 创建微流(请参阅从菜单项触发微流
- 保护您的应用程序(请参阅如何创建安全应用程序)
3 准备数据结构、GUI 和模块
在开始将数据导入应用程序之前,您首先需要按照以下步骤设置数据结构和 GUI:
1. 创建以下域模型:
为OrderStatus属性创建一个枚举,其值为Open 、 Processing和Complete 。
将XLSFile对象配置为从FileDocument对象继承。
2. 创建概览和详细信息页面以管理客户和订单类型的对象。
3. 创建菜单项以访问订单和客户概览页面。
4. 为ExcelImportOverview和MxObjects_Overview页面创建菜单项(这些页面已存在于下载模块的_USE_ME文件夹中)。
5. 将Administrator用户角色配置为具有ExcelImporter模块的Configurator模块角色,以及Mx 模型反射模块的ModelAdministrator模块角色。
4 准备数据导入的逻辑
因为枚举用于OrderStatus属性,所以您需要创建一个微流来根据 Excel 文件的输入确定属性的枚举值。如果导入数据没有枚举的情况,可以忽略此步骤。
1. 创建以下微流并将其命名为IVK_ParseStatus。
2. 设置返回值如下:
if $Unformatted = 'open' then MyFirstModule.OrderStatus.Open
else if $Unformatted = 'processing' then MyFirstModule.OrderStatus.Processing
else if $Unformatted = 'complete' then MyFirstModule.OrderStatus.Complete
else MyFirstModule.OrderStatus.Complete
3. 保存微流。
5 在客户端使用应用程序模型元数据
为了设置用于导入数据的导入模板,您的应用程序模型元数据应该反映在客户端。这可以通过使用Mx 模型反射模块来实现。按照以下步骤执行此操作:
- 单击播放按钮(本地运行)以启动的应用程序。
- 单击查看应用程序以在浏览器中打开您的应用程序。
- 以管理员身份登录。
- 在导航中单击MxObjects_Overview的菜单项。
- 通过选中左侧的框来选择包含要在客户中使用的对象的模块——在本例中为MyFirstModule:
- 单击左侧 Synchronize all entities and microflows of checked modules 旁边的按钮。现在可以在客户端看到和使用来自MyFirstModule模块的两个对象和解析微流。
6 手动创建导入模板
在将 Excel 文件中的数据导入应用程序之前,必须设置导入模板。在此模板中,将配置数据应映射到的对象、对象是否与另一个对象关联、导入应从 Excel 文件的哪一行开始以及应导入哪些列。
将从一个简单的 Excel 文件示例中导入数据,该示例可在此处下载:
下载示例
根据要导入的文件的结构,需要按照以下步骤手动设置模板:
- 单击应用主页导航中的ExcelImportOverview菜单项。
- 点击新建模板:
3. 为模板命名。
4. 单击Mendix对象框旁边的箭头。
5. 双击客户对象:
6. 单击“引用以导入对象”框旁边的箭头。
7. 选择Customer_XLSFile关联。通过设置与 XLS 文件的关联,将 XLS 文件保存在磁盘上,并将导入的数据连接到源文件。
8. 确保导入操作设置为同步对象:
对于此示例,将使用一个简单的 Excel 文件,该文件在第一行只有一个工作表和列标题。如果使用更全面的 Excel 文件,可以通过Sheet nr 、 Header row nr和Import from row nr字段更改这些值。
9. 在将列连接到属性部分中,单击新建以创建从 Excel 工作表列到正确Mendix属性的映射。
10. 添加与要映射的 Excel 文件中的列号对应的列号。
Excel 中第一列的编号为 0,第二列为 1,依此类推。
11. 将 Excel 列标题定义为Caption值。
12. 为类型选择属性。
13. 单击属性框旁边的箭头:
14. 双击要将 Excel 值映射到的属性:
15. 对Customer对象的每个属性重复上述步骤 9 到 14。
- 对于Name属性的映射,将Key值设置为Yes以防止重复客户。
如果映射设置正确,则行前会出现一个绿色对勾。
16. 现在需要为Order对象属性创建映射。但是,因为Order对象与Customer对象相关联,所以映射设置会略有不同。对Order对象的每个属性执行以下步骤:
- 添加与要映射的 Excel 文件中的列号对应的列号。
- 将 Excel 列标题定义为Caption值。
- 为类型选择参考。
- 单击参考框旁边的箭头,您可以在其中选择将订单链接到客户的关联——在本例中应为 Order_Customer。
- 单击属性框旁边的箭头,然后双击要将 Excel 值映射到的属性。
- 对于属性Number的映射,将Key值设置为Yes,仅针对关联对象,以防止重复订单。
- 单击Save。
17. 对于OrderStatus属性的映射,需要将 Excel 文件值解析为枚举值。为此,您可以使用IVK_ParseStatus微流(在上面的准备数据导入逻辑部分中创建)。单击Parse with框旁边的箭头并选择IVK_ParseStatus微流:
18. 保存导入模板。
6.1 导入 Excel 文件
现在模板已设置好,可以开始将数据从 Excel 文件导入到您的应用程序中。可以使用在上面的创建导入模板部分下载的示例文件。
按照以下步骤导入 Excel 文件:
- 单击应用主页导航中的ExcelImportOverview菜单项。
- 转到导入文件选项卡并单击新建:
3. 选择刚刚创建的模板。
4. 点击浏览:
5. 选择您下载的示例 Excel 文件,然后单击Save。
6. 单击Filename下的 Excel 文件将其选中,然后单击Import file:
7. 导入完成后单击确定。
这样就完成了Excel数据导入,至于后续的逻辑处理就可以通过微流来实现,不在本次介绍的范围内。
四、应用展示
完成了Excel组件的配置后,让我们看看针对前面的两个客户需求的实际应用效果。
项目一
Excel上传模板
Planner上传后生成的数据
经过计算后的展现不同BU,产品线,Group的数据
通过Excel导入的主数据
项目二
工厂员工导入的Excel工时模板
填写表单然后上传Excel
最终数据展示
五、参考资料
- Excel组件 Marketplace介绍https://marketplace.mendix.com/link/component/72
- MX Model Reflection组件MarketPlace介绍https://marketplace.mendix.com/link/component/69
- Community Common组件介绍https://marketplace.mendix.com/link/component/170
- Excel导入具体文档参考https://docs.mendix.com/appstore/modules/excel-importer/#413-header-row-nr 和Import Excel Documents | Mendix Documentation
关于Mendix
Mendix,a Siemens business是全球企业级低代码的领导者,正在从根本上重塑数字化企业构建应用的方式。企业可通过Mendix低代码软件快速开发平台来扩展自身的开发能力,打破软件开发的瓶颈。借助Mendix开发平台,企业可以打造具备智能、主动性和人机互动等原生体验的智能化应用,对核心系统进行现代化升级并实现规模化应用开发,以跟上业务增长的速度。Mendix低代码软件快速开发平台可在保持最高安全、质量和治理标准的前提下,促进业务与IT团队之间的密切合作,大大缩短应用开发周期,帮助企业自信迈向数字化未来。Mendix的“Go Make It”平台已被全球4000多家领先公司采用。