EasyExcel特点

采用一行一行的解析模式,并将一行的解析结果以解析者的模式通知处理

概念

  • 整个excel称为 workbook
  • 每个 workbook 里面有 sheet
  • 每个 sheet 有 行 列 单元格

引入依赖

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

写操作

创建实体类(和excel对应),设置表头和添加的数据字段

image-20220926202949617
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TestWrite {
public static void main(String[] args) {
//设置文件名称和路径
String fileName = "C:\\Users\\29392\\Desktop\\test.xlsx";
//调用方法
EasyExcel.write(fileName,User.class)
.sheet("写操作")
.doWrite(data());
}

//循环设置要添加的数据,最终封装到list集合中
private static List<User> data() {
List<User> list = new ArrayList<User>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setId(i);
user.setName("张三"+i);
list.add(user);
}
return list;
}
}
image-20220926204029879

读操作

1、创建和excel对应的实体类,设置对应关系

image-20220926204547720

2、创建监听器,进行一行一行地解析

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ExcelListener extends AnalysisEventListener<User> {
//创建list集合封装最终的数据
List<User> list = new ArrayList<User>();
//一行一行去读取excle内容,把每行数据都封装到user对象
//从excel第二行开始读取
@Override
public void invoke(User user, AnalysisContext analysisContext) {
System.out.println(user);
list.add(user);
}
//读取excel表头信息
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("表头信息:"+headMap);
}
//读取完成后执行
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
}
}

3、最后调用EasyExcel读方法实现操作

1
2
3
4
5
6
7
public class TestRead {
public static void main(String[] args) throws Exception {
String fileName = "C:\\Users\\29392\\Desktop\\test.xlsx";
// 这里需要指定读用哪个class去读,然后读取第一个sheet文件流会自动关闭
EasyExcel.read(fileName,User.class, new ExcelListener()).sheet().doRead();
}
}
image-20220926205047348