一、EasyExcel概述
Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,能够原本一个3M的excel用POI sax依然需要100M左右内存降低到几M,并且再大的excel不会出现内存溢出,03版依赖POI的sax模式。在上层做了模型转换的封装,让使用者更加简单方便。
github地址:https://github.com/alibaba/easyexcel
使用文档:https://alibaba-easyexcel.github.io/
官方给出的数据,64M内存1分钟内读取75M(46W行25列)的Excel,当然还有急速模式能更快,但是内存占用会在100M多一点:
二、EasyExcel常用功能
读Excel
最简单的读
指定列的下标或者列名
读多个sheet
日期、数字或者自定义格式转换
多行头
同步的返回
读取表头数据
数据转换等异常处理
不创建对象的读
web中的读
写Excel
最简单的写
根据参数只导出指定列
指定写入的列
复杂头写入
重复多次写入(写到单个或者多个Sheet)
日期、数字或者自定义格式转换
图片导出
根据模板写入
列宽、行高
自定义样式
合并单元格
使用table去写入
动态头,实时生成头写入
自动列宽(不太精确)
自定义拦截器(上面几点都不符合但是要对单元格进行操作的参照这个)
不创建对象的写
web中的写
web中的写并且失败的时候返回json
填充Excel
最简单的填充
填充列表
复杂的填充
数据量大的复杂填充
横向的填充
三、EasyExcel使用方法和调优
官方除了文档外,还提供了强大的demo代码。代码就不贴了,我只给出maven坐标:
1<dependency>
2 <groupId>com.alibabagroupId>
3 <artifactId>easyexcelartifactId>
4 <version>2.1.4version>
5dependency>
默认大文件处理
默认大文件处理会自动判断,共享字符串5M以下会使用内存存储,大概占用15-50M的内存,超过5M则使用文件存储,然后文件存储也要设置多内存M用来存放临时的共享字符串,默认20M。除了共享字符串占用内存外,其他占用较少,所以可以预估10M,所以默认大概30M就能读取一个超级大的文件。
根据实际需求配置内存
四、EasyExcel的核心原理
1、文件解压文件读取通过文件形式
2、避免将全部全部数据一次加载到内存
采用sax模式一行一行解析,并将一行的解析结果以观察者的模式通知处理。
3、抛弃不重要的数据
Excel解析时候会包含样式,字体,宽度等数据,但这些数据是我们不关心的,如果将这部分数据抛弃可以大大降低内存使用。Excel中数据中Style占了相当大的空间。
五、该项目的优缺点
该项目不是阿里重点项目,目前只有三个人维护,但项目很活跃,获得的star数也很高,可以作为生产来使用。但要注意,目前还有以下功能尚未实现:
单个文件的并发写入、读取
读取图片
宏
csv读取(这个后续可能会考虑)