重复工作自动化——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,如需转载请自行联系原作者

相关文章
|
20天前
|
数据采集 数据可视化 数据挖掘
利用Python自动化处理Excel数据:从基础到进阶####
本文旨在为读者提供一个全面的指南,通过Python编程语言实现Excel数据的自动化处理。无论你是初学者还是有经验的开发者,本文都将帮助你掌握Pandas和openpyxl这两个强大的库,从而提升数据处理的效率和准确性。我们将从环境设置开始,逐步深入到数据读取、清洗、分析和可视化等各个环节,最终实现一个实际的自动化项目案例。 ####
|
2月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
143 4
|
3月前
|
Python
Python办公自动化:xlwings对Excel进行分类汇总
Python办公自动化:xlwings对Excel进行分类汇总
104 1
|
3月前
|
Python
Python自动化:xlwings合并Excel
Python自动化:xlwings合并Excel
64 0
|
1月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
95 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
26天前
|
前端开发
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
27 1
|
3月前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
2月前
|
Python
Python 自动化操作 Excel - 02 - xlwt
Python 自动化操作 Excel - 02 - xlwt
43 14
|
2月前
|
Python
Python 自动化操作 Excel - 03 - xlutils
Python 自动化操作 Excel - 03 - xlutils
41 13
|
2月前
|
机器学习/深度学习 存储 测试技术
从0到1:如何规划一套流量回放自动化测试方案
本文介绍了流量回放自动化测试的完整方法,从企业战略到交付的四个关键环节:Discovery(深度挖掘)、Define(定义目标)、Design(详细设计)和Delivery(交付与反馈)。通过这些步骤,帮助企业优化系统性能和稳定性,确保产品的高质量。
67 4