文章目录
-
-
- EasyExcel简介
- [Spring Boot整合EasyExcel](#Spring Boot整合EasyExcel)
-
EasyExcel简介
1、EasyExcel 是一个基于 Java 的简单、省内存的读写 Excel 的开源项目。在尽可能节约内存的情况下支持读写百 M 的 Excel(没有一次性将数据读取到内存中,从磁盘中一行行读取,从而节约内存)。
2、EasyExcel 采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理。EasyExcel官网
Spring Boot整合EasyExcel
1、引入依赖:
xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.0</version>
</dependency>
2、添加 excel 对应的实体类信息:
java
@Data
public class User {
@ExcelProperty("姓名")
private String userName;
@ExcelProperty("邮箱")
private String email;
@ExcelProperty("年龄")
private Integer age;
}
@ExcelProperty
用于定义 excel 表中列的列名(表头)
一、单sheet写操作
java
@SpringBootTest
class ApplicationTests {
@Test
void testWrite() {
// 文件保存的位置
String fileName = "G:/test/test.xlsx";
EasyExcel.write(fileName, User.class).sheet("用户表").doWrite(list());
}
// 简单造写数据,用于测试
public List<User> list() {
List<User> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
User user = new User();
user.setUserName("tom" + i);
user.setAge((int)(Math.random() * 20));
user.setEmail(user.getUserName() + "@163.com");
list.add(user);
}
return list;
}
}
二、多sheet写数据
写入不同的 sheet,因此需要用到更灵活的方式,通过创建 ExcelWriter
来实现。这种方法可以控制每个 sheet 的名称、索引和数据来源。
适用场景:复杂、多 sheet 写入或分页写入。
java
//假设这个map里面有数
Map<Integer, Page<Salaries>> map = new HashMap<>();
//1.获取ExcelWriter实例
try (ExcelWriter excelWriter = EasyExcel.write(文件输出流, Salaries.class).build()) {
//遍历Map:转为Set集合
for (Map.Entry<Integer, Page<Salaries>> setMap : map.entrySet()) {
Integer key = setMap.getKey();
Page<Salaries> salariesPage = entry.getValue();
/* 2.获取WriteSheet的实例,每个 writeSheet 表示一个单独的工作表
两个参数:第一个是sheet的索引,第二个是sheet的名字
*/
WriteSheet writeSheet = EasyExcel.writerSheet(key, "模板" + key).build();
/* 开始写
两个参数:数据、WriteSheet对象
*/
excelWriter.write(salariesPage.getRecords(), writeSheet);
}
} catch (IOException e) {
e.printStackTrace();
}
在 try
语句中创建 ExcelWriter
,确保在完成写操作后自动关闭 ExcelWriter
资源,避免资源泄漏。
① 为什么后面有 build() ?
build()
方法在 EasyExcel
中的作用是构建一个 ExcelWriter
或 WriteSheet
实例。
- 构建了一个
ExcelWriter
对象,允许我们自定义写入流程(如多个 sheet 的写入、批量写入等) - 构建了一个
WriteSheet
对象,指定 sheet 的索引和名称等,用于在指定的 sheet 上进行写操作。
② 不调 build() ?
build()
是必需的,因为 EasyExcel 使用建造者模式。
三、读操作
基本与 写操作 类似,但是需要定义一个监听器(继承 AnalysisEventListener 抽象类),用于监听操作。
监听器:监听 excel 读取操作。(这里例子没有将监听器交给 Spring 管理)
java
/**
* 定义一个数据监听器,继承 AnalysisEventListener 抽象类。
*/
public class DataListener extends AnalysisEventListener<User> {
// 一行行读取表格内容
@Override
public void invoke(User user, AnalysisContext analysisContext) {
System.out.println("===============" + user);
}
// 读取表头内容
@Override
public void invokeHeadMap(Map<Integer, String> headMap, AnalysisContext context) {
System.out.println("======表头内容========" + headMap);
}
// 读取完成后的操作
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("========读取完成========");
}
}
java
//测试
@SpringBootTest
class TestEasyexcelApplicationTests {
@Test
void testRead() {
// 读取文件的位置
String fileName = "G:/test/test.xlsx";
EasyExcel.read(fileName, User.class, new DataListener()).sheet().doRead();
}
}