筆者之前一直使用POI讀寫Excel文件,最近有個需求需要讀取大概80萬行數(shù)據(jù)的Excel,使用POI讀取到10.2萬行左右就卡死不動了,而且CPU占用直接拉滿到100%,內(nèi)存占用也很高。
查找資料后,發(fā)現(xiàn)POI提供了讀取大量數(shù)據(jù)的方法,但是用起來比較復(fù)雜。同時(shí)看到有人提到用EasyExcel讀取Excel的速度快,資源占用少。于是換成EasyExcel去讀取那個80萬行數(shù)據(jù)的Excel,發(fā)現(xiàn)讀取速度確實(shí)很快,CPU和內(nèi)存占用也很少。
然而EasyExcel的官方文檔中,最簡單的讀寫代碼都是默認(rèn)與數(shù)據(jù)庫有交互,寫了一些分頁讀寫數(shù)據(jù)庫的代碼,還是不夠簡潔。所以個人參考EasyExcel的官方文檔,寫了一個更加簡潔、清晰的,使用EasyExcel讀取Excel的樣例。
1.在pom.xml中添加POI相關(guān)依賴
<!-- easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel-core</artifactId>
<version>3.3.2</version>
</dependency>
2.實(shí)體類文章來源:http://www.zghlxwxcb.cn/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的類文章來源地址http://www.zghlxwxcb.cn/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("每讀取到一行數(shù)據(jù)就會執(zhí)行該方法:" + JSON.toJSONString(entity));
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("所有數(shù)據(jù)讀取完成后執(zhí)行該方法");
}
}).doRead();
return list;
}
}
到了這里,關(guān)于使用EasyExcel讀寫Excel文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!