EasyExcel

官方文档: https://easyexcel.opensource.alibaba.com/docs/current/

两种读对象的方式:

  1. 确定表头:建立对象,和表头形成映射关系
  2. 不确定表头:每一行数据映射为 Map<String, Object>

两种读取模式:

  1. 监听器:先创建监听器、在读取文件时绑定监听器。单独抽离处理逻辑,代码清晰易于维护;一条一条处理,适用于数据量大的场景。
  2. 同步读:无需创建监听器,一次性获取完整数据。方便简单,但是数据量大时会有等待时常,也可能内存溢出。

添加EasyExcel步骤:

1.添加依赖

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.0</version>
</dependency>

2.定义读的对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Data
public class XingQiuTableUserInfo {
/**
* id
*/
@ExcelProperty("成员编号")
private String planetCode;

/**
* 用户昵称
*/
@ExcelProperty("成员昵称")
private String username;
}

同步读取数据的方式

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 同步读取数据
*/
public static void synchronousRead(String fileName) {
String fileName = "E:\\yupi\\星球项目\\yupao- backend\\src\\main\\resources\\testExcle.xlsx";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finish
List<XingQiuTableUserInfo> totalDataList =
EasyExcel.read(fileName).head(XingQiuTableUserInfo.class).sheet().doReadSync();
for (XingQiuTableUserInfo xingQiuTableUserInfo : totalDataList) {
System.out.println(xingQiuTableUserInfo);
}
}

(1)定义一个主类启动即可

1
2
3
public static void main(String[] args) {
synchronousRead(fileName);
}

采用监听器的方式读取数据

(1)定义一个监听器 tableListener 类

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
// 有个很重要的点 XingQiuTableUserInfoListener 不能被spring管理,要每次读取excel都要new,然后里面用到spring可以构造方法传进去
@Slf4j
public class TableListener implements ReadListener<XingQiuTableUserInfo> {

/**
* 这个每一条数据解析都会来调用
*
* @param data one row value. Is is same as {@link AnalysisContext#readRowHolder()}
* @param context
*/
@Override
public void invoke(XingQiuTableUserInfo data, AnalysisContext context) {
System.out.println(data);
}

/**
* 所有数据解析完成了 都会来调用
*
* @param context
*/
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 这里也要保存数据,确保最后遗留的数据也存储到数据库
System.out.println("已解析完成");
}
}

(2)封装为方法 readByListener

1
2
3
4
5
6
7
8
/**
* 监听器读取数据
* @param fileName
*/
private static void readByListener(String fileName) {
String fileName = "E:\\yupi\\星球项目\\yupao-backend\\src\\main\\resources\\testExcle.xlsx";
EasyExcel.read(fileName, XingQiuTableUserInfo.class, new TableListener()).sheet().doRead();
}

(3)定义一个主类启动即可

1
2
3
public static void main(String[] args) {
readByListener(fileName);
}