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