导出数据列表公共类
1、用户场景:用户进入查询列表页面,输入查询条件,对查询结果的显示字段做个性化操作。
=》勾选希望显示的字段后点击导出按钮=》浏览器下载导出的excel文件到本地=》excel显示所有的查询结果。
2、导出数据列表excel公共类为MainInfo.SmartMold.Common.DataListExportExcelService
3、类内部的方法大部分实现了隐藏和封装,对外开放的方法大致是两个。
首先调用GetData(action,request)获取导出数据,然后将得到的数据作为参数传给ExportExcelByData方法,得到文件流(byte[]格式)和文件名FileName。
Tip:为什么要调用两个方法?
为了让调用方可以更灵活地对导出数据做自定义的处理。尽管在ExportExcelByData中允许传入自定义的委托方法CompleteData来进行自定义数据的处理,但无法在列表数据的整体层面上做更改,例如linq语句等。
使用示例
1、注入。
注入需要实现泛型,即查询接口返回的Dto。
如果注入后接口报错,可能是带泛型的类没有被配置。
2、实现导出文件方法。
传入分页查询列表的方法名和参数给GetData方法获得导出数据。(PS:导出数据最多为3000行)。
接下来可以对导出数据进行处理/不处理。
调用ExportExcelByData方法,表名根据模块和单据名称自定义但是不需要带上日期时间,最后一个参数可以为空,也可以传入方法名。
委托的返回值和参数都是固定的。通常的自定义数据方法逻辑为:根据propertyName字段名称判断是否需要做出更改,再将object类型做转换,做是否为空判断,完善后的数据用return new CellValueInfo(value)即可。
如果不需要对其他的字段做处理,请return null,导出公共类内部会做处理。
PS:EnumHelper公共类提供了对枚举的一系列处理方法。
3、接口实现文件下载。
URL请尽量统一。
前端传值和分页获取列表接口基本一致,只多了两个数组,且两个数组应一一对应,但不做强制要求。
由于返回的是文件类型,因此接口的返回值和写法都有所不同。当前示例是导出excel格式的文件。
4、需要注意的细节。
① 金额显示的格式会根据当前公司的本位币的币种档案中的精度来设置,但是如何区分单价、金额和比率?
目前的解决办法是,根据前端传入的title值来判断。
即double类型的字段Cost,对应的title如果为XX价,则判断为单价显示,如果包含%,则判断为百分比显示,以上都没有,则判断为金额显示。
② 日期和实现统一显示为yyyy-MM-dd HH:mm:ss
③ 只支持以下几种数据类型的字段值的显示:
object、guid、string、double、decimal、int、datetime、bool
其他的数据类型都会显示空字符串。
④ 导出人由于用户登录模块没有实现,因此也全都为测试数据。
⑤ 包含中文的excel文件名在Postman中测试会出现中文名被替换成_显示的问题。但在谷歌浏览器直接调用和swagger(在谷歌浏览器中打开)测试中皆正常。
⑥ 由于该通用导出功能比较简单,只适用于单表结构或子表数据不太需要导出的情况,例如基础数据等。