使用@ExcelProperty注解实现Excel数据导入导出
EasyExcel框架通过@ExcelProperty注解简化Java中的Excel操作,显著提升开发效率。其核心优势包括注解驱动自动匹配字段表头、零模板代码和高性能SAX解析模式。实施步骤涵盖环境配置、实体类设计(支持多级表头)、数据导出导入实战(含Web响应设置及监听器模式),并提供了日期处理、动态表头等高级特性。针对大数据量场景,建议采用分批处理和缓存控制策略。该方案相比传统POI可减少70
目录
一、应用场景
在Java开发中,Excel数据导入导出是高频需求(如报表生成、数据迁移)。传统POI API操作繁琐,而 EasyExcel 框架的 @ExcelProperty 注解可大幅简化流程!核心优势:
✅ 注解驱动:通过注解自动匹配字段与表头
✅ 零模板代码:无需手动处理单元格坐标
✅ 高性能:基于SAX模式解析,内存占用低
二、环境准备
依赖配置(Maven):
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.3.4</version>
</dependency>
三、实体类设计
使用 @ExcelProperty 绑定表头与字段:
@Data
public class User {
@ExcelProperty("用户ID")
private Long id;
@ExcelProperty(value = "用户名", index = 1) // index指定列顺序
private String name;
@ExcelProperty(value = {"联系信息", "邮箱"}) // 支持多级表头
private String email;
@ExcelIgnore // 不参与导入导出
private String password;
}
四、数据导出实战
步骤:
- 准备数据集合
- 设置导出路径
- 调用
EasyExcel.write()
List<User> users = Arrays.asList(
new User(1L, "张三", "zhang@example.com"),
new User(2L, "李四", "li@example.com")
);
String fileName = "export.xlsx";
EasyExcel.write(fileName, User.class)
.sheet("用户数据")
.doWrite(users);
Web环境导出时需设置响应头:
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + URLEncoder.encode("导出.xlsx", "UTF-8"));
五、数据导入实战
方法一:
步骤:
1.创建监听器 AnalysisEventListener
2.重写 invoke() 逐行处理
3.调用 EasyExcel.read()
public class UserDataListener extends AnalysisEventListener<User> {
private final List<User> cachedList = new ArrayList<>();
@Override
public void invoke(User user, AnalysisContext context) {
cachedList.add(user); // 单行数据捕获
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
saveToDatabase(cachedList); // 所有数据解析完成后入库
}
//业务代码,自行处理
private void saveToDatabase(List<User> cachedList) {
userMapper.batchInsert(cachedList);
}
}
启动导入只需指定文件路径和监听器:
EasyExcel.read("import.xlsx", User.class, new UserDataListener())
.sheet()
.doRead();
方法二:
直接业务代码转换并保存,无需使用监听器
@PostMapping("/import")
public void importDataManage(@RequestParam MultipartFile file) throws IOException {
InputStream inputStream = file.getInputStream();
List<User> users = EasyExcel.read(inputStream)
.head(User.class)
.sheet() // 设置sheet,默认读取第一个
.headRowNumber(1) // 设置标题所在行数
.doReadSync();
//对users进行处理即可
}
六、高级特性应用
日期格式处理:
@ExcelProperty("注册日期")
@DateTimeFormat("yyyy年MM月dd日")
private Date registerDate;
动态表头生成:
List<List<String>> head = Arrays.asList(
Arrays.asList("基本信息", "用户ID"),
Arrays.asList("基本信息", "用户名"),
Arrays.asList("联系信息", "手机号")
);
EasyExcel.write(fileName)
.head(head)
.sheet()
.doWrite(dataList);
七、性能优化建议
对于百万级数据:
- 导出时使用
ExcelWriterBuilder.registerWriteHandler添加AbstractRowHeightStyleStrategy避免内存堆积 - 导入时配置
ReadListener实现分批次处理 - 设置
autoCloseStream=true确保资源释放
八、异常处理方案
常见问题应对:
- 乱码问题:确保所有环节使用UTF-8编码
- 类型转换失败:实现
Converter<T>接口自定义转换逻辑 - 内存溢出:通过
ReadCache参数控制缓存大小
EasyExcel.read(inputStream, User.class, listener)
.readCache(new MapCache(1024)) // 设置缓存行数
.sheet()
.doRead();
九、结语
通过 @ExcelProperty + EasyExcel,代码量减少70%,同时规避了POI的内存溢出风险。无论是百万级数据导出,还是复杂表头导入,都能轻松应对!
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)