在现代软件开发中,Excel导入导出功能是许多业务系统中的常见需求。无论是用于数据批量处理、报表生成还是用户数据上传,这一功能都显得尤为重要。EasyExcel 是阿里巴巴开源的一款轻量级的 Excel 处理工具,它基于 Java 开发,相较于传统的 Apache POI,具有更高的性能和更简单的使用方式。
本文将详细介绍如何为你的项目添加 Excel 导入导出功能,并提供完整的 EasyExcel 示例代码。
首先,在你的 Maven 项目中引入 EasyExcel 的依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version> <!-- 请根据需要选择最新版本 -->
</dependency>
如果你使用的是 Gradle,可以添加以下依赖:
implementation 'com.alibaba:easyexcel:3.0.5'
EasyExcel 支持通过注解的方式将 Java 对象与 Excel 表格字段进行映射。我们以一个简单的用户信息表为例,定义如下实体类:
import com.alibaba.excel.annotation.ExcelProperty;
public class User {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("邮箱")
private String email;
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
以下是实现 Excel 导出功能的完整代码示例:
import com.alibaba.excel.EasyExcel;
import java.util.ArrayList;
import java.util.List;
public class ExcelExportExample {
public static void main(String[] args) {
// 准备数据
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 25, "zhangsan@example.com"));
userList.add(new User("李四", 30, "lisi@example.com"));
// 设置导出文件路径
String fileName = "users.xlsx";
// 调用 EasyExcel 写入数据
EasyExcel.write(fileName, User.class).sheet("用户信息").doWrite(userList);
System.out.println("Excel 文件已成功导出!");
}
}
EasyExcel.write()
方法用于指定输出文件路径和实体类。.sheet("用户信息")
定义了工作表名称。doWrite(userList)
将数据写入到 Excel 文件中。以下是实现 Excel 导入功能的完整代码示例:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import java.util.ArrayList;
import java.util.List;
public class ExcelImportExample {
public static void main(String[] args) {
// 设置导入文件路径
String fileName = "users.xlsx";
// 调用 EasyExcel 进行读取
List<User> userList = new ArrayList<>();
EasyExcel.read(fileName, User.class, new UserListener(userList)).sheet().doRead();
// 打印导入的数据
for (User user : userList) {
System.out.println("姓名:" + user.getName() + ", 年龄:" + user.getAge() + ", 邮箱:" + user.getEmail());
}
}
// 自定义监听器
static class UserListener extends AnalysisEventListener<User> {
private final List<User> userList;
public UserListener(List<User> userList) {
this.userList = userList;
}
@Override
public void invoke(User data, AnalysisContext context) {
// 每解析一行数据会调用一次该方法
userList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 全部解析完成后执行的操作
}
}
}
EasyExcel.read()
方法用于指定输入文件路径和实体类。new UserListener(userList)
是自定义的监听器,用于接收解析后的数据。invoke()
方法会在每一行数据解析完成后被调用。对于大文件的处理,EasyExcel 提供了流式读取的功能,避免一次性加载所有数据到内存中。以下是一个优化后的导入示例:
EasyExcel.read(fileName, User.class, new AnalysisEventListener<User>() {
@Override
public void invoke(User data, AnalysisContext context) {
// 处理每一条数据
System.out.println(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 全部解析完成后执行的操作
}
}).sheet().doRead();
在实际项目中,可能需要对导入的数据进行校验。EasyExcel 提供了 @ExcelProperty
注解的扩展功能,例如设置格式化规则或校验规则。
import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.format.NumberFormat;
import com.alibaba.excel.annotation.validate.Validation;
public class User {
@ExcelProperty("姓名")
@Validation(required = true)
private String name;
@ExcelProperty("年龄")
@NumberFormat("#")
@Validation(min = 18, max = 60)
private Integer age;
@ExcelProperty("邮箱")
@Validation(required = true, regex = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$")
private String email;
// Getters and Setters
}
通过上述步骤,我们可以轻松地为项目添加 Excel 导入导出功能。EasyExcel 的核心优势在于其简单易用的 API 和高性能的处理能力,非常适合处理中小规模的 Excel 文件。