在现代企业应用开发中,数据导入导出是一个常见的需求。EasyExcel 是阿里巴巴开源的一个轻量级 Excel 处理工具,它能够高效地处理大文件的读写操作,特别适合与 Spring Boot 集成以实现后台数据的导入导出功能。
以下是一份详细的集成指南,帮助开发者快速上手 EasyExcel 与 Spring Boot 的结合使用。
EasyExcel 是基于 SAX 解析器开发的,相比传统的 POI 工具,它具有更高的性能和更低的内存占用。其核心优势包括:
在 pom.xml
文件中添加 EasyExcel 和相关依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.0.5</version>
</dependency>
确保你的项目已经引入了 Spring Boot 的 Web 模块,例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
假设我们要处理一个包含用户信息的 Excel 文件,可以创建如下实体类:
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
@Data
public class User {
@ExcelProperty("姓名")
private String name;
@ExcelProperty("年龄")
private Integer age;
@ExcelProperty("邮箱")
private String email;
}
@ExcelProperty
注解用于指定 Excel 表头与字段的映射关系。@Data
注解减少样板代码。以下是实现数据导出的核心代码:
import com.alibaba.excel.EasyExcel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
@RestController
public class ExportController {
@GetMapping("/export")
public void export(HttpServletResponse response) throws IOException {
// 设置响应头
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("用户数据", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// 准备数据
List<User> userList = new ArrayList<>();
userList.add(new User("张三", 25, "zhangsan@example.com"));
userList.add(new User("李四", 30, "lisi@example.com"));
// 导出数据
EasyExcel.write(response.getOutputStream(), User.class).sheet("用户信息").doWrite(userList);
}
}
关键点解析:
EasyExcel.write
方法指定输出流和实体类。sheet("用户信息")
定义工作表名称。doWrite(userList)
将数据写入 Excel 文件。以下是实现数据导入的核心代码:
import com.alibaba.excel.EasyExcel;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.List;
@RestController
public class ImportController {
@PostMapping("/import")
public String importData(@RequestParam("file") MultipartFile file) throws Exception {
InputStream inputStream = file.getInputStream();
List<User> userList = EasyExcel.read(inputStream)
.head(User.class)
.sheet()
.doReadSync();
// 打印或保存数据到数据库
userList.forEach(System.out::println);
return "导入成功!共导入 " + userList.size() + " 条记录。";
}
}
关键点解析:
EasyExcel.read
方法读取上传的文件。head(User.class)
指定实体类作为映射对象。doReadSync()
同步读取数据并返回列表。为了增强系统的健壮性,可以为导入导出功能添加异常捕获机制。例如:
try {
EasyExcel.write(outputStream, User.class).sheet("用户信息").doWrite(dataList);
} catch (Exception e) {
e.printStackTrace();
return "导出失败,请检查数据格式!";
}
对于大数据量的导入场景,建议启用分页读取模式:
EasyExcel.read(inputStream, User.class, new AnalysisEventListener<User>() {
@Override
public void invoke(User user, AnalysisContext context) {
// 每读取一行数据时触发
System.out.println("当前行数据:" + user);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 所有数据读取完毕后触发
System.out.println("所有数据已读取完毕!");
}
}).sheet().doRead();
以下是数据导入导出的整体流程图:
graph TD A[开始] --> B{选择操作} B --> C[导出数据] B --> D[导入数据] C --> E[生成Excel文件] E --> F[返回文件下载链接] D --> G[读取Excel文件] G --> H[解析数据并存储] H --> I[返回成功消息] F --> J[结束] I --> J
通过上述步骤,我们可以轻松实现基于 Spring Boot 和 EasyExcel 的数据导入导出功能。EasyExcel 提供了简单易用的 API,同时具备高性能和灵活性,非常适合处理大规模的 Excel 文件。