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

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

背景

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

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

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

思路

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

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

类图

文件导入框架的入口是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,如需转载请自行联系原作者

重复工作自动化——excel导入方案相关推荐

  1. 30 个 高效办公的Python 小程序,让重复工作自动化!

    996 一直是互联网老生常谈的话题了,但抛开其他只谈工作本身,你有没有想过,下班晚.加班,有时候可能是因为自己工作比较低效? 在这给你分享一个案例: 场景是在维护日活超过 3 亿用户的微博私信平台,在 ...

  2. Excel导入30万条数据和导出50万条数据方案

    背景:最近在做一个功能改造,老系统Excel导入导出大批量数据,要求支持一次性导入30万条数据,一次性导出50万条数据,还需要对数据进行校验,另外对性能有要求,不能比老系统的性能差.和业务了解了老系统 ...

  3. 工作表格excel用python_Python自动化处理Excel报表,工作更轻松

    没有转义的Excel! Excel无处不在,即使我们使用了Python之类强大的辅助工具,依然无法摆脱Excel. 因为你的老板和同事仍然需要方便的方法来访问重要数据. 但是,这并不意味着你不能通过使 ...

  4. 导入python标准数学函数模块的语句_《Python编程快速上手——让繁琐工作自动化》——2.8 导入模块...

    本节书摘来自异步社区<Python编程快速上手--让繁琐工作自动化>一书中的第2章,第2.8节,作者[美] Al Sweigart,王海鹏 译,更多章节内容可以访问云栖社区"异步 ...

  5. Python批量下载电子邮件附件并汇总合并Excel文件_如何让繁琐工作自动化:聊聊Python与RPA...

    RPA,是Robotic Process Automation的英文缩写,中文是机器人流程自动化,利用软件将重复性的工作自动化.基本目标是让人从重复性强的繁琐工作中解放出来去做更有意义更具创造性的工作 ...

  6. access 套用表格_在Excel 2013工作表中导入Access数据的方法

    Excel与Access同为数据处理软件,它们在功能上各有侧重.Access精于数据管理和分类,而Excel则长于数据统计和计算.这两个软件处理过的数据是可以互相调用的,综合应用这两个软件,取长补短, ...

  7. Excel工作圈金蝶KIS标准版从excel导入凭证_DBF格式凭证

    Excel工作圈金蝶KIS标准版从excel导入凭证_DBF格式凭证,迷你版 很多财务会计使用金蝶标准版/迷你版,想从excel导入凭证,如何操作呢? 很多财务会计使用金蝶标准版/迷你版,想从exce ...

  8. 告别加班:一个让你不再重复工作的技能

    996 一直是互联网老生常谈的话题了,但抛开其他只谈工作本身,你有没有想过,下班晚.加班,有时候可能是因为自己工作比较低效? 前阵子领导层打算引进一个大项目,要林晓做份详细报告作决策依据. 这时她遇到 ...

  9. python经典书记必读:Python编程快速上手 让繁琐工作自动化

    所属网站分类: 资源下载 > python电子书 作者:熊猫烧香 链接:http://www.pythonheidong.com/blog/article/69/ 来源:python黑洞网,专注 ...

最新文章

  1. 学习笔记——ArrayList总结
  2. MavenMybatis可能会遇到的问题
  3. 元气森林,饮料界的小罐茶?
  4. 什么是mysql的游标_数据库中的游标到底是什么意思
  5. oracle星形转换,Oracle数据仓库博客(转,学)
  6. 【数据结构与算法】之深入解析“比特位计数”的求解思路与算法示例
  7. 基于GitBook框架搭建技术文档平台
  8. 【AI视野·今日CV 计算机视觉论文速览 第153期】Fri, 16 Aug 2019
  9. java仔_Java基础语法吐血整理
  10. 复盘Spring中定时任务和异步线程池
  11. PI和模糊控制器的simulink仿真
  12. C语言中的各种百分号都代表什么意思
  13. 意识与本我、自我、超我理论
  14. python培训湖南
  15. Tekla二次开发之切割部分的详解
  16. 线性代数 线性相关与线性表示的理解
  17. Java+SSM二手交易商城微信小程序源码【包调试运行】
  18. 1.回文是指正读和反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。试写一个算法判定给定的字符向量是否为回文。(提示:将一半字符入栈。)2.假设以带头结点的循环链
  19. 计算机账户注销重新登录,win10系统注销账户切换账号登录的方法
  20. 游戏策划概述(二)——设计

热门文章

  1. MIT用超导体制成极低功耗神经元,能效接近人类大脑,比计算机高4个量级
  2. 【跃迁之路】【674天】程序员高效学习方法论探索系列(实验阶段431-2018.12.19)...
  3. Web前端经典面试试题(一)
  4. Apple Mach-O Linker Error
  5. APACHE利用Limit模块限制IP连接数
  6. PostgreSql安装(win 2003 下)
  7. 5G NGC — 关键技术 — 网络切片 — 概述
  8. Socket 网络编程实践经验
  9. NR 5G SDAP业务数据适配协议
  10. [python skill]利用python计算T分布下的置信区间