1. 为什么选择EasyExcel处理Excel数据
在Java生态中处理Excel文件,我们通常面临两种选择:Apache POI和EasyExcel。POI作为老牌工具确实功能强大,但实际使用中我发现它有几个致命痛点。比如处理10万行数据时,内存占用直接飙到2GB,服务器频繁Full GC;再比如复杂样式代码写起来像在组装火箭,一个合并单元格要写十几行代码。
而EasyExcel作为阿里开源的组件,完美解决了这些问题。去年我接手一个学生档案管理系统,需要处理全省50万学生的数据导入。用POI的方案测试时,单次导入直接OOM崩溃。换成EasyExcel后,内存稳定在200MB以内,导入速度提升3倍。这主要得益于它的两大设计:
- 基于事件模型的流式读取:像SAX解析XML一样逐行处理,不一次性加载整个文件
- 注解驱动的对象映射:用
@ExcelProperty标注字段,自动完成类型转换
看个直观对比:
java复制// POI读取代码片段
Workbook workbook = new XSSFWorkbook(inputStream);
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
Cell nameCell = row.getCell(0);
// 需要手动处理类型、空值、格式...
}
// EasyExcel等效代码
EasyExcel.read(inputStream, Student.class, new AnalysisEventListener() {
@Override
public void invoke(Student data, AnalysisContext context) {
// 自动完成对象转换
}
}).sheet().doRead();
实际项目中还会遇到更多痛点场景。比如教务系统要求导入时实时显示进度条,用传统方式得自己写多线程。而EasyExcel内置的AnalysisEventListener能轻松获取当前行数,配合WebSocket就能实现实时进度反馈。再比如导出时要求复杂表头合并,POI需要操作底层API,EasyExcel通过@ContentLoopMerge注解一行代码搞定。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 项目初始化与基础配置
2.1 创建SpringBoot项目
推荐使用Spring Initializr创建项目骨架,我习惯用以下组合:
- JDK 17(LTS长期支持版)
- Spring Boot 2.7.x(目前最稳定版本)
- 勾选Lombok(减少样板代码)
- 勾选Web模块(提供HTTP接口)
关键依赖如下:
xml复制<dependencies>
<!-- EasyExcel核心库 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.2</version>
</dependency>
<!-- 数据库相关 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3.1</version>
</dependency>
<!-- 其他省略... -->
</dependencies>
2.2 配置文件关键项
在application.yml中需要特别注意这些配置:
yaml复制spring:
servlet:
multipart:
max-file-size: 50MB
