EasyExcel 是阿里巴巴开源的一个基于 Java 的 Excel 处理工具,旨在简化开发者在处理 Excel 数据时的复杂性。相比于传统的 Apache POI 等工具,EasyExcel 提供了更高的性能和更简洁的 API 设计,特别适合用于大规模数据的读写操作。本文将详细介绍如何使用 EasyExcel 来简化你的 Excel 处理工作。
在 Maven 项目中添加以下依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version> <!-- 版本号请根据实际需要调整 -->
</dependency>
确保使用 JDK 8 或更高版本,因为 EasyExcel 需要依赖 Lambda 表达式等特性。
假设我们需要将一个包含用户信息(如姓名、年龄、邮箱)的数据集写入 Excel 文件。
import com.alibaba.excel.EasyExcel;
public class WriteExample {
public static void main(String[] args) {
// 目标文件路径
String fileName = "user_data.xlsx";
// 数据集合
List<UserData> data = new ArrayList<>();
data.add(new UserData("张三", 25, "zhangsan@example.com"));
data.add(new UserData("李四", 30, "lisi@example.com"));
// 写入 Excel
EasyExcel.write(fileName, UserData.class).sheet("用户信息").doWrite(data);
}
}
// 数据模型类
@Data
public class UserData {
private String name;
private Integer age;
private String email;
public UserData(String name, Integer age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
public UserData() {}
}
EasyExcel.write
方法用于创建写入器。UserData.class
指定数据模型类,EasyExcel 会自动根据类中的字段名与 Excel 列头进行匹配。.sheet("用户信息")
定义工作表名称。假设我们需要从 Excel 文件中读取用户信息。
import com.alibaba.excel.EasyExcel;
public class ReadExample {
public static void main(String[] args) {
// 源文件路径
String fileName = "user_data.xlsx";
// 读取 Excel
EasyExcel.read(fileName, UserData.class, new UserDataListener()).sheet().doRead();
}
}
// 自定义监听器
public class UserDataListener extends AnalysisEventListener<UserData> {
@Override
public void invoke(UserData userData, AnalysisContext context) {
System.out.println("读取到一条数据: " + userData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
System.out.println("所有数据已读取完毕");
}
}
EasyExcel.read
方法用于创建读取器。UserDataListener
是自定义的监听器,用于处理每条数据的回调逻辑。.doRead()
开始执行读取操作。当面对超大数据量的 Excel 文件时,可以通过分页读取来避免内存溢出。
public class LargeFileReadExample {
public static void main(String[] args) {
String fileName = "large_file.xlsx";
EasyExcel.read(fileName, UserData.class, new PageReadListener<>(dataList -> {
// 每次读取一批数据后触发的回调
System.out.println("当前批次数据: " + dataList);
})).sheet().doRead();
}
}
PageReadListener
是内置的分页读取监听器,每次读取一定数量的数据后会触发回调。如果 Excel 列头名称与 Java 字段名不一致,可以通过 @ExcelProperty
注解指定映射关系。
@Data
public class UserData {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("电子邮件")
private String email;
}
在读取数据时,可以通过自定义监听器对数据进行校验。
@Override
public void invoke(UserData userData, AnalysisContext context) {
if (userData.getAge() == null || userData.getAge() <= 0) {
throw new RuntimeException("年龄数据无效: " + userData);
}
System.out.println("读取到一条有效数据: " + userData);
}
EasyExcel 支持导出带有样式和公式的模板文件。
EasyExcel.write("template.xlsx").withTemplate("template_template.xlsx").sheet().doFill(dataMap);