easyexcel阿里巴巴excel处理工具

简介

之前写个一篇easypoi的工具,在使用excel模板方面有很多bug,所以重新找了一个工具。easyexcel一看名字和项目拥有者,就觉得靠谱。它自己也说了,是为了简化poi,优化内存消耗,所以才出现了这个工具。所以上手是很简单,很快。https://www.yuque.com/easyexcel/doc/read

定义一个对象,通过注解@ExcelProperty指定当前字段对应excel中的那一列。可以根据名字或者Index去匹配。要想了解其他信息,可查阅官方文档

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 SerumExcelDataBean implements Serializable {
@ExcelProperty("编号")
private String index;
@ExcelProperty("1")
private Double num1;
@ExcelProperty("2")
private Double num2;
public String getIndex() {
return index;
}

public void setIndex(String index) {
this.index = index;
}

public Double getNum1() {
return num1;
}

public void setNum1(Double num1) {
this.num1 = num1;
}

public Double getNum2() {
return num2;
}

public void setNum2(Double num2) {
this.num2 = num2;
}
}

调用EasyExcel.read方法,就能把数据读到listSource里面了,当然官方不建议直接读到内存里面,而是建议把excel数据边读边写入的数据库中。具体可以参考文档

1
List<SerumExcelDataBean> listSource = EasyExcel.read(filePath + sourceDataName).head(SerumExcelDataBean.class).sheet(0).doReadSync();

EasyExcel写,最简单的就是根据对象属性上面的@ExcelProperty注解来对应列名,写入到excel中。其他情况详见官方文档

1
2
3
String fileName = "D:" + File.separator + System.currentTimeMillis() + ".xlsx";
// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭
EasyExcel.write(fileName, SerumExcelDataBean.class).sheet("模板").doWrite(data());

最常用到的就是使用excel模板,固定填充位置,把相应的数据填入excel中。首先在模板中加入表达式,表达式主要有对象{name}和列表{.name}{data1.name}两种。详见文档

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
/**
* 多列表组合填充填充
*
* @since 2.2.0-beta1
*/
@Test
public void compositeFill() {
// 模板注意 用{} 来表示你要用的变量 如果本来就有"{","}" 特殊字符 用"\{","\}"代替
// {} 代表普通变量 {.} 代表是list的变量 {前缀.} 前缀可以区分不同的list
String templateFileName = TestFileUtil.getPath() + "demo" + File.separator + "fill" + File.separator + "composite.xlsx";
String fileName = TestFileUtil.getPath() + "compositeFill" + System.currentTimeMillis() + ".xlsx";
ExcelWriter excelWriter = EasyExcel.write(fileName).withTemplate(templateFileName).build();
WriteSheet writeSheet = EasyExcel.writerSheet().build();
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
// 如果有多个list 模板上必须有{前缀.} 这里的前缀就是 data1,然后多个list必须用 FillWrapper包裹
excelWriter.fill(new FillWrapper("data1", data()), fillConfig, writeSheet);
excelWriter.fill(new FillWrapper("data2", data()), writeSheet);
excelWriter.fill(new FillWrapper("data3", data()), writeSheet);

Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2019年10月9日13:28:28");
excelWriter.fill(map, writeSheet);

// 别忘记关闭流
excelWriter.finish();
}

总结

easyexcel确实是一个非常好用的工具类, 大大的简化了excel处理复杂度。