文章目录
- EasyExcel使用详解
-
- 一、引言
- 二、环境准备与基础配置
- [三、Excel 读取详解](#三、Excel 读取详解)
- [四、Excel 写入详解](#四、Excel 写入详解)
- 五、总结
EasyExcel使用详解
一、引言
EasyExcel 是阿里巴巴开源的一款基于 Java 的 Excel 处理工具,专注于高性能和低内存占用,尤其适合处理百万级数据的大文件。相比传统的 Apache POI,EasyExcel 通过流式读写和智能内存管理,显著降低了内存溢出风险,同时提供了简洁的 API 和灵活的注解配置。本文将从基础配置到实际应用场景,详解 EasyExcel 的核心功能。
二、环境准备与基础配置
1、添加依赖
在 pom.xml
中引入 EasyExcel 依赖(以最新稳定版为例):
xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.0</version>
</dependency>
2、定义实体类
通过注解 @ExcelProperty
映射 Excel 列名或索引,@ExcelIgnore
忽略字段:
java
@Data
public class User {
@ExcelProperty("用户ID")
private Long id;
@ExcelProperty(value = "姓名", index = 1) // 指定列索引
private String name;
@ExcelProperty("创建时间")
private Date createTime;
@ExcelIgnore // 不参与读写
private String remark;
}
三、Excel 读取详解
1、基础读取
使用 PageReadListener
实现分批处理(默认每 100 条处理一次):
java
String fileName = "user_data.xlsx";
EasyExcel.read(fileName, User.class, new PageReadListener<User>(dataList -> {
dataList.forEach(user -> System.out.println("读取数据:" + user.getName()));
})).sheet().doRead();
2、自定义监听器
实现 ReadListener
接口,手动控制数据批次:
java
@Slf4j
public class UserListener implements ReadListener<User> {
private static final int BATCH_SIZE = 200;
private List<User> cachedList = new ArrayList<>(BATCH_SIZE);
@Override
public void invoke(User user, AnalysisContext context) {
cachedList.add(user);
if (cachedList.size() >= BATCH_SIZE) {
saveToDatabase(cachedList); // 模拟入库操作
cachedList.clear();
}
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
if (!cachedList.isEmpty()) saveToDatabase(cachedList);
log.info("所有数据解析完成!");
}
private void saveToDatabase(List<User> list) {
// 实际业务中调用 DAO 层
}
}
调用方式:
java
EasyExcel.read(fileName, User.class, new UserListener()).sheet().doRead();
3、多 Sheet 处理
支持读取多个 Sheet,每个 Sheet 可绑定不同监听器:
java
try (ExcelReader excelReader = EasyExcel.read(fileName).build()) {
ReadSheet sheet1 = EasyExcel.readSheet(0).head(User.class).registerReadListener(new UserListener()).build();
ReadSheet sheet2 = EasyExcel.readSheet(1).head(Order.class).registerReadListener(new OrderListener()).build();
excelReader.read(sheet1, sheet2);
}
四、Excel 写入详解
1、基础写入
直接写入数据列表,自动生成表头:
java
List<User> userList = queryUsersFromDB(); // 从数据库查询数据
EasyExcel.write("export_users.xlsx", User.class)
.sheet("用户列表")
.doWrite(userList);
2、动态列与复杂表头
通过 @ExcelProperty
定义多级表头和列顺序:
java
@Data
public class SaleData {
@ExcelProperty({"销售信息", "订单号"})
private String orderId;
@ExcelProperty({"销售信息", "金额"})
private BigDecimal amount;
@ExcelProperty(value = "时间", index = 2) // 指定列顺序
private Date createTime;
}
3、样式与模板填充
支持基于模板的填充(如财务报表):
java
// 填充模板中的占位符(如 {name})
Map<String, Object> data = new HashMap<>();
data.put("name", "张三");
data.put("amount", 10000);
EasyExcel.write("report.xlsx")
.withTemplate("template.xlsx")
.sheet()
.doFill(data);
五、总结
EasyExcel 凭借其高性能 和低内存占用,成为处理大文件 Excel 的首选工具。通过灵活的注解配置和事件监听机制,开发者可以轻松实现复杂的数据映射和分批处理逻辑。无论是数据导入导出,还是模板化报表生成,EasyExcel 均能高效完成。
版权声明 :本博客内容为原创,转载请保留原文链接及作者信息。
参考文章: