笔者之前一直使用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.实体类文章来源:https://www.toymoban.com/news/detail-541548.html
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的类文章来源地址https://www.toymoban.com/news/detail-541548.html
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>() {
@Override
public void invoke(StudentEntity entity, AnalysisContext analysisContext) {
list.add(entity);
System.out.println("每读取到一行数据就会执行该方法:" + JSON.toJSONString(entity));
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("所有数据读取完成后执行该方法");
}
}).doRead();
return list;
}
}
到了这里,关于使用EasyExcel读写Excel文件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!