前言
今天忙完,上面派发了一个任务,有个项目的导出接口数据量太大了,导出直接内存溢出(OOM),暂时做法是限制导出的行数,然后让我去研究一下,通过一下午的研究,通过EasyExcel解决了这个问题,并且大幅度提高了映射速度,如下图:
EasyExcel介绍
EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目,alibaba旗下的高性能处理Excel工具。在尽可能节约内存的情况下支持读写百M的Excel.
Java解析、生成Excel比较常用的框架有Apache POI、JXL,但是他们都有一个严重的问题就是耗内存,POI有一套SAX模式的API可以一定程度上解决一些内存溢出的问题,但POI还是有一些缺陷
比如:07版本的Excel解压后存储都是在内存中完成的,内存消耗依旧很大。EasyExcel重写了POI对07版本Excel的解析,能够让原本一个3M的Excel用POI SAX需要用到100M左右内存降低到几M,并且再大的Excel都不会出现内存溢出,并且它在上层做了模型转换的封装,让使用者更简单。
64M内存1分钟内读取75M(46W行25列)的Excel,以上来源于官网↑↑
Github 开源地址:GitHub地址
语雀案例地址:官网案例
快速使用
导入Maven依赖 ps:这里只做导出数据示范,更多操作请参考官网
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>2.2.4</version>
</dependency>
实体类(模版对象):
@Data
public class DemoData {
@ExcelProperty("字符串标题")
private String string;
// 这里用string 去接日期才能格式化。我想接收年月日格式
@DateTimeFormat("yyyy年MM月dd日HH时mm分ss秒")
@ExcelProperty("日期标题")
private Date date;
@ExcelProperty("数字标题")
//我想接收百分比的数字
// @NumberFormat("#.##%")
private Double doubleData;
//忽略这个字段
@ExcelIgnore
private String ignore;
}
测试:
@Test
public void yy(){
// 写法1
String fileName =