笔者之前一直使用POI读写Excel文件,最近有个需求需要读取大概80万行数据的Excel,使用POI读取到10.2万行左右就卡死不动了,而且CPU占用直接拉满到100%,内存占用也很高。
查找资料后,发现POI提供了读取大量数据的方法,但是用起来比较复杂。同时看到有人提到用EasyExcel读取Excel的速度快,资源占用少。于是换成EasyExcel去读取那个80万行数据的Excel,发现读取速度确实很快,CPU和内存占用也很少。
然而EasyExcel的官方文档中,最简单的读写代码都是默认与数据库有交互,写了一些分页读写数据库的代码,还是不够简洁。所以个人参考EasyExcel的官方文档,写了一个更加简洁、清晰的,使用EasyExcel读取Excel的样例。
1.在pom.xml中添加POI相关依赖
<!-- easyexcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel-core</artifactId><version>3.3.2</version></dependency>
2.实体类
package com.example.study.entity;import com.alibaba.excel.annotation.ExcelProperty;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Getter;
import lombok.Setter;import java.util.Date;@Getter
@Setter
public class StudentEntity {@ExcelProperty(value = "id", order = 1)private Integer id;@ExcelProperty(value = "生日", order = 4)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date birthday;@ExcelProperty(value = "名字", order = 2)private String name;@ExcelProperty(value = "性别", order = 3)private String sex;
}
3.读取Excel的类
package com.example.study.common;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSON;
import com.example.study.entity.StudentEntity;
import lombok.extern.slf4j.Slf4j;import java.util.ArrayList;
import java.util.List;@Slf4j
public class EasyExcelDemo {public static void main(String[] args) {String readExcel = "F:\\tmp\\students.xlsx";String writeExcel = "F:\\tmp\\students-write.xlsx";List<StudentEntity> list = read(readExcel);write(writeExcel, list);}private static void write(String fileName, List<StudentEntity> list) {EasyExcel.write(fileName).head(StudentEntity.class).sheet("EasyExcel Writed 1").doWrite(list);}private static List<StudentEntity> read(String excel) {List<StudentEntity> list = new ArrayList<>();EasyExcel.read(excel).head(StudentEntity.class).sheet(1).registerReadListener(new ReadListener<StudentEntity>() {@Overridepublic void invoke(StudentEntity entity, AnalysisContext analysisContext) {list.add(entity);System.out.println("每读取到一行数据就会执行该方法:" + JSON.toJSONString(entity));}@Overridepublic void doAfterAllAnalysed(AnalysisContext analysisContext) {System.out.println("所有数据读取完成后执行该方法");}}).doRead();return list;}
}