对于easyexcel
1.逻辑层面的理解,为什么会有这个技术栈,解决什么情景的什么问题
2.如何选择依赖版本,把这个技术栈配置到springboot工程中去,需要配置什么内容
3.这里面对于excel操作,需要操作什么领域
4.在代码层面,如何操作,提供了哪些机制供使用
由于时间不够,这个下面的具体内容,其实还是很泛,不全,不深刻。有空在调整一下。
EasyExcel 是阿里巴巴开源的一个Java处理Excel的工具库,设计目标是在简单易用的同时,解决传统工具(如Apache POI)在处理大文件时极易引发内存溢出(OOM)的痛点。
1. 🤔 逻辑层面的理解:为什么会有EasyExcel?
- 解决的核心问题:高效处理大数据量Excel文件并节省内存。
- 技术背景:传统的Apache POI解析Excel时,会将整个文件加载到内存,文件稍大就容易导致应用OOM(内存溢出)或频繁的Full GC,尤其在服务器高并发场景下风险极大。
- 解决原理 :EasyExcel采用逐行读取的模式。它不是一次性把文件全读进内存,而是一行一行地从磁盘读取、解析,然后让你处理。这使得原本一个3M的Excel,用POI可能消耗100M内存,而用EasyExcel可以降到几M,从根本上解决了大文件的内存问题。
2. ⚙️ 如何整合到Spring Boot?
EasyExcel的整合非常简单,几乎不需要额外配置。
-
版本选择建议 :建议优先选择较新的稳定版,例如
3.1.2或更高版本(你可根据项目创建时间在Maven中央仓库查询最新版本)。需要注意,这个版本要求项目JDK版本为1.8及以上。 -
Maven依赖配置 :在你的Spring Boot项目的
pom.xml文件中,直接引入EasyExcel的依赖即可。无需 像配置数据库那样添加额外的spring-boot-starter-xxx或其他配置类。xml<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.2</version> </dependency>
3. 🎯 操作Excel涉及的领域
使用EasyExcel操作Excel,主要围绕两个核心领域:读(导入) 和 写(导出)。
- 数据对象(Model):你需要创建一个普通的Java类(POJO)来映射Excel表格的一行数据。
- Excel元数据:涉及到表头(标题行)的映射、数据格式(如日期、数字)的转换等。
- 业务处理逻辑:将读取到的数据如何进行校验、存储到数据库;或者从数据库查询哪些数据进行导出。
4. 🚀 代码层面如何操作?
EasyExcel提供了基于注解 和监听器的编程模型,让代码非常简洁。
📝 1. 定义数据模型
使用注解 @ExcelProperty 来映射Excel的列。
java
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
@Data
public class UserData {
// 用index指定第几列(0代表第一列)
@ExcelProperty(index = 0)
private String name;
// 也可以用value根据表头名称匹配
@ExcelProperty(value = "年龄")
private Integer age;
// 处理日期格式
@ExcelProperty(value = "生日")
private Date birthday;
}
📖 2. 执行"读"操作(导入Excel)
这是最关键的步骤,核心是监听器(Listener)。EasyExcel逐行解析,每解析完一行就会回调监听器的方法,你在这里处理这一行数据(如存入数据库),然后这一行的内存就会被回收。
-
第一步:创建读取监听器
javaimport com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.read.listener.ReadListener; import lombok.extern.slf4j.Slf4j; @Slf4j public class UserDataListener implements ReadListener<UserData> { // 每解析一行,就会调用一次这个方法 @Override public void invoke(UserData data, AnalysisContext context) { log.info("解析到一条数据: {}", data); // 在这里处理这一行数据,比如做校验,存入数据库等 // 建议攒够一批(如100条)再批量存入数据库,提升性能 } // 所有数据都解析完成后,会调用这个方法 @Override public void doAfterAllAnalysed(AnalysisContext context) { log.info("所有数据解析完成!"); // 在这里可以做收尾工作,比如清理资源 } } -
第二步:在Controller中调用
监听器不能被Spring管理 ,需要每次读取时
new一个实例。如果监听器里需要用到Service,可以通过构造方法传进去。java@RestController public class ExcelController { // 假设你需要用到UserService来保存数据 @Autowired private UserService userService; @PostMapping("/upload") public String upload(MultipartFile file) throws IOException { // 创建监听器时,把需要的Service传进去 UserDataListener listener = new UserDataListener(userService); // 开始读取 EasyExcel.read(file.getInputStream(), UserData.class, listener) .sheet() // 选择第一个sheet .doRead(); return "上传成功"; } }
✍️ 3. 执行"写"操作(导出Excel)
导出则简单很多,不需要监听器,可以直接用API将数据集合写出。
java
@GetMapping("/download")
public void download(HttpServletResponse response) throws IOException {
// 1. 设置响应头,告诉浏览器这是一个需要下载的Excel文件
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("用户数据", "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
// 2. 模拟从数据库查出要导出的数据
List<UserData> dataList = userService.listAllUsers();
// 3. 使用EasyExcel写出
EasyExcel.write(response.getOutputStream(), UserData.class)
.sheet("用户列表") // 设置sheet名称
.doWrite(dataList); // 执行写入
}
总的来说,EasyExcel的核心设计思想就是"逐行处理",这是它省内存的根本原因。 在使用时,只要牢牢抓住实体映射 、读取监听器 和响应输出流这三个关键点,就能非常流畅地在Spring Boot项目中实现Excel的导入导出功能了。