EasyExcel简介
对于apache提供的Apache poi,它非常容易造成内存泄露,因为是一次性将Excel文件都读到内存,而EasyExcel是按照一个Sheet的一行一行读取到内存当中,这样便于后期处理,就能避免内存泄露
使用EasyExcel导入.xls或.xlsx文件
普通导入并输出
第一种:稍微复杂的写法,不过很标准
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class ReadComplex {
public static void main(String[] args) {
ExcelReaderBuilder builder = EasyExcel.read();
//读取的文件绝对路径
builder.file("C:\\Users\\wangwei\\Documents\\excel\\demo.xlsx");
//读取的表格
builder.sheet("模板");
builder.autoCloseStream(true);
//读取的文件类型
builder.excelType(ExcelTypeEnum.XLSX);
//注册读取监听器
builder.registerReadListener(new AnalysisEventListener() {
@Override
public void invoke(Object o, AnalysisContext analysisContext) {
//监听者模式,每读完一行就会调用的方法
System.out.println(o);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
//所有数据读完后调用
System.out.println("====读取完成====");
}
});
//获取读取器
ExcelReader build = builder.build();
build.readAll();
//完成所有的读取,并且关闭流
build.finish();
}
}
第二种是简便的写法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ReadExcel {
public static void main(String[] args) {
EasyExcel.read("C:\\Users\\wangwei\\Documents\\excel\\demo.xlsx")
//如果不指定sheetName,默认读取所有的表格
.sheet("模板")
.registerReadListener(new AnalysisEventListener() {
@Override
public void invoke(Object o, AnalysisContext analysisContext) {
System.out.println(o.toString());
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("====读取完成====");
}
})
.doRead();
}
}
这种方法采用链式编程的方式,并且只设置关键的参数:sheet名、文件名和监听器,最后调用doRead方法就可以读取数据了
使用JavaBean接收Excel表格每行的数据
首先说明,通过debug,我们得知在监听器内部的invoke()的参数O,实际读取时的类型是LinkedHashMap,并且key为Integer,value为String
但是通常我们会用JavaBean去接收数据,具体步骤如下:
1.首先是我们的Excel文件数据
2.然后是JavaBean类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Data
public class ExcelData {
@ExcelProperty("排名")
private Integer rank;
@ExcelProperty("选项ID")
private String itemId;
@ExcelProperty("标题")
private String title;
@ExcelProperty("编号")
private Long code;
@ExcelProperty("描述")
private String desc;
@ExcelProperty("得票数")
private Integer voteCount;
@ExcelProperty("活动ID")
private String activityId;
@ExcelProperty("创建时间")
private Date createTime;
}
3.第三部,开始读取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ReadExcelByObj {
public static void main(String[] args) {
//用来保存接收到的数据
ArrayList<ExcelData> list = new ArrayList<>();
EasyExcel.read("C:\\Users\\wangwei\\Documents\\excel\\demo.xlsx")
//接收数据的JavaBean类型
.head(ExcelData.class)
.sheet("模板")
.registerReadListener(new AnalysisEventListener<ExcelData>() {
@Override
public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
list.add(excelData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("====读取完成====");
}
})
.doRead();
for (ExcelData excelData : list) {
System.out.println(excelData);
}
}
}
也很简单,相比于简便写法,就多出了用head()指定JavaBean的类型
使用EasyExcel导出Excel文件
写数据也非常简单,这里就演示如何将JavaBean导出到Excel,直接上代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class WriteExcel {
public static void main(String[] args) {
List dataList = getExcelDataList();
EasyExcel.write("C:\\Users\\wangwei\\Documents\\excel\\demo_副本.xlsx")
.head(ExcelData.class)
.excelType(ExcelTypeEnum.XLSX)
.sheet("list")
.doWrite(dataList);
}
public static List getExcelDataList(){
ArrayList<ExcelData> list = new ArrayList<>();
EasyExcel.read("C:\\Users\\wangwei\\Documents\\excel\\demo.xlsx")
//接收数据的JavaBean类型
.head(ExcelData.class)
.sheet("模板")
.registerReadListener(new AnalysisEventListener<ExcelData>() {
@Override
public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
list.add(excelData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("====读取完成====");
}
})
.doRead();
return list;
}
}
从代码中看出,写出文件也非常简单,同样用head()指定JavaBean的类型,然后是文件类型、文件保存的位置和Sheet名,最后调用doWrite写出就完成了