最近我在 Github 上查找一个可以快速开发 Execl 导入导出工具,偶然发现由阿里开发 easyexecl 开源项目,尝试使用后感觉这款工具挺不错的,分享一下我的 easyexecl 案例使用。
1、easyexecl 简介
一般在项目可能会涉及到 Execl 导入和导出,通常我们都是使用 Apache POI 或者 jxl。 但他们都存在一个严重的问题就是非常的耗内存,POI 有一套 SAX 模式的 API 可以一定程度的解决一些内存溢出的问题,但 POI 依旧存在一些缺陷,比如 07 版 Excel 解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。 而 easyexcel 重写了 POI 对 07 版 Excel 的解析,能够原本一个 3M 的 Execl 用 POI SAX 依然需要 100M 左右内存降低到 KB 级别,并且再大的 Excel 不会出现内存溢出,03 版依赖 POI 的 SAX 模式。 在上层做了模型转换的封装,使用起来更加方便。
2、项目结构
2.1、pom.xml
2.2、模型
@Data 是 Lombok 插件的注解,需要先安装。 @Data 注解在类上,会为类的所有属性自动生成 set/get、equals、canEqual、hashCode、toString方法。
RowNumExcelListener
使用 easyexcel,我们需要继承 AnalysisEventListener 。 必须实现 invoke() 和 doAfterAllAnalysed() 方法。 easyexecl 会调用 invoke() 将数据存入 List 中。
2.3、读操作
当只读取一个 Execl 的一个sheet,可以直接 EasyExcelFactory.readBySax() 方法解析 Execl 文件。
读取多个 sheet,需要通过读取所有 sheet,再进行选择读取哪些数据,读取完一个 sheet,需要重新清空列表,不然会导致所有 sheet 数据都存储在列表中。
2.4、写操作
根据模型的写入,通过 ExcelWriter 的 wirter() 方法,ExcelWriter 根据 sheet 预先设置的 模型生成和插入数据。
(推荐)根据模板的写入,根据一个 Execl 文件为模板,生成 Execl 文件。
easyexecl 还支持对单元格的样式的控制,通过 WriteHandler 接口实现。 但是 easyexecl 所支持的样式要比 POI 少,官方也不是不推荐使用 easyexecl 进行实现复杂的 Execl。 easyexecl 主要为了解决 OOM 的问题,实现低消耗读取解析文件。
如何实现通过浏览器下载 Execl 文件,案例中使用的文件输出流,要实现网络下载,只需要把对应的输出流改为获取 Response 进行输出即可。
3、小结
一般在项目实现 Execl 导入导出功能,easyexecl是可以胜任的,easyexecl 有着这处理海量数据的 Execl 的能力和更高一级的封装,可以让我们更快的上手,easyexecl 适用于解析海量数据 Execl 场景,如果需要实现生成复杂的 Execl 文件,最好还是使用 POI 比较好。
更加详细的信息可以查看 github 上的内容,GitHub链接为 https://github.com/alibaba/easyexcel。
ps:需要完整代码,关注公众号,回复‘easyexecl’获得 ~
推荐阅读:
学机器学习怎么可以不知道最小二乘法
Scala 函数式编程(一) 什么是函数式编程?
缓存世界中的三大问题及解决方案