重复工作自动化——excel导入方案

简介:

     计算机与人相比,有什么优势?这个问题从计算机诞生之初就不断被回答:在重复性工作上,计算机有人类无法企及的计算速度和存储空间。因此,把重复性工作交给计算机,也就是常说的“可复用性”,是软件设计中的一个最基本的思想。

        这里记录的这个小设计,就是把重复工作自动化处理的一个例子。


背景

        在我们的系统中,经常有用户上传一个Excel文件、系统进行处理的需求。

        Excel的处理框架,有Jxl和POI。我们的系统使用了POI框架,并封装了若干个Util工具类。但是,由于工具类的封装不到位,业务代码中仍然会有大量的解析Excel文件(并且还存留了很多只接受.xls文件、无法处理.xlsx文件的代码)、遍历sheet/row/cell、处理单元格和Java对象类型转换的重复代码。    

        因此,我设计实现了这个小小的工具。


思路

        Excel导入的基本流程如下图所示。这个导入工具封装了校验、Excel转pojo这两个步骤,数据处理则作为扩展点留给了业务代码。

文件解析基本流程

wKioL1j06hvxrUw-AABYD8uFot0335.png-wh_50


        除基本功能外,这个框架还需要考虑性能问题。因此,方案中要为Excel转pojo和数据处理这两个操作预留异步的扩展点,以期提高处理效率。并且据我以前的测试,一个大小为1MB的Excel文件,放入JVM中之后要占用约2MB的内存空间。所以这个框架还应尽量节省(或者尽快释放)内存空间。


类图

FileImportor类图wKiom1j06hzDqZ7oAAGPGws09NM321.png-wh_50

        文件导入框架的入口是FileImporrtor接口。主方法入参是一个标记接口,其中要求提供字节数组,作为待导入的文件数据。导入时如果还需要其它数据,可以在实现接口时自行扩展、提供。

        这里将文件转化为字节数组,主要有两点考虑。一方面,这样做可以兼容不同格式、不同封装的文件。例如,无论是MultipartFile还是File、无论是txt还是doc文件,都可以在转成字节数组后纳入框架中来进行处理。另一方面,无论是File还是InputStream,都会占用句柄、连接等资源。管理这些资源并不是这个框架的职能——事实上,技术框架都无法确定业务资源应当何时关闭。因此,接口只接受字节数组形式的入参。

        框架中实现了一个Excel的导入类FileImportor4Excel。这个类使用POI框架作为底层工具。其中处理其实很简单,就是使用POI解析出excel文件后,遍历其中的sheet/row/cell,将其中数据转换为Java封装类。

        解析Excel的流程中,将数据转换为Java封装类是比较困难的一个点。因为Excel中的数据类型只有那么几种,定义为Cell中的几个int常量。但是Java类型却有千千万。如何把它们正确的转换为Java类型?框架中引入了CellValueTransfer和ExcelImportHelper这两个类。CellValueTransfer是一个接口,定义了将POI的Cell转换为Java类的方法,并提供了若干个基础实现类。而ExcelImportHelper则是一个辅助类,用于为当前的Cell和Java类找到合适的CellValueTransfer,并执行转换操作。

        后来增加了FileImportor4ExcelParallel,引入了多线程来处理。其中使用的线程池是ForkJoinPool,因为Excel导入恰可以“分而治之”。不过引入多线程后,整个Excel中的数据就无法在同一个事务中进行处理了。

        此外还增加了一个带回调函数的类FileImportor4ExcelCallback。因为原逻辑中,需要将Excel全部转换为List然后再做处理。加入Callback之后,则可以每转换一条数据就处理一条数据,并且可以在处理完成后迅速丢弃(设置为null)该数据,以尽快释放内存。



本文转自 斯然在天边 51CTO博客,原文链接:http://blog.51cto.com/winters1224/1916847,如需转载请自行联系原作者

相关文章
|
23天前
|
SQL 缓存 easyexcel
面试官问10W 行级别数据的 Excel 导入如何10秒处理
面试官问10W 行级别数据的 Excel 导入如何10秒处理
51 0
|
1月前
|
存储 BI 数据处理
Python自动化 | 解锁高效办公利器,Python助您轻松驾驭Excel!
Python自动化 | 解锁高效办公利器,Python助您轻松驾驭Excel!
|
2月前
|
数据采集 数据可视化 数据处理
【办公自动化】在Excel中按条件筛选数据并存入新的表2.0
【办公自动化】在Excel中按条件筛选数据并存入新的表2.0
47 1
|
3月前
|
BI 索引 Python
python报表自动化系列 - 译码:与Excel单元格索引对应的十进制数坐标
python报表自动化系列 - 译码:与Excel单元格索引对应的十进制数坐标
17 1
|
2月前
|
数据采集 机器学习/深度学习 数据可视化
【办公自动化】使用Python批量处理Excel文件并转为csv文件
【办公自动化】使用Python批量处理Excel文件并转为csv文件
48 0
|
3月前
|
BI 索引 Python
python报表自动化系列 - Excel单元格(Cell)索引范围对应的所有单元格
python报表自动化系列 - Excel单元格(Cell)索引范围对应的所有单元格
26 0
|
5天前
|
easyexcel 数据库
公司大佬对excel导入、导出的封装,那叫一个秒啊
封装公司统一使用的组件的主要目标是为了简化开发人员的调用流程,避免各个项目组重复集成和编写不规范的代码。文中提到对阿里EasyExcel进行了二次封装,提供了导入和导出功能,并支持模板的导入和导出。此外,还处理了读取数据与实际保存数据不一致的情况,通过提供自定义转换器来解决。
18 0
|
22天前
|
人工智能 数据可视化 机器人
【办公自动化】Excel透视表的简单应用
【办公自动化】Excel透视表的简单应用
|
1月前
|
机器学习/深度学习 数据采集 运维
高效处理异常值的算法:One-class SVM模型的自动化方案
高效处理异常值的算法:One-class SVM模型的自动化方案
36 1
|
1月前
|
存储 数据处理 数据格式
Python中导入Excel数据:全面解析与实践
Python中导入Excel数据:全面解析与实践
42 0