news 2026/5/1 8:16:22

SpringBoot + EasyExcel 导出文件,太香了!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringBoot + EasyExcel 导出文件,太香了!

还记得刚入行时,一听到 "Excel 导出" 就条件反射地冒冷汗 ——POI 那套 API 跟迷宫似的,CellStyle 能把人调得眼冒金星,大数据量导出时内存飙到 90% 的恐惧至今难忘。直到去年被产品经理逼到墙角时,发现了 Alibaba 的 EasyExcel,从此打开新世界的大门。

今天就把这套 "导出救命锦囊" 分享给大家,顺便穿插点当年踩坑的段子,让咱们在笑声中搞定 Excel 导出。

01

先给项目把 EasyExcel 的 "脉"—— 环境整合篇

1. 引入依赖:别让 Maven 耍小脾气

首先在pom.xml里加依赖,这里得注意版本兼容性。我曾试过用最新版 EasyExcel 配老 Spring Boot,结果像小孩打架似的报错不断。建议直接抄作业:

<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>

加完记得刷新 Maven,这玩意儿有时候像闹情绪的女朋友,得哄着来。

2. 创建实体类:给数据贴 "xxx"

咱得先定义 Excel 里每一列的数据结构,就像给每个字段发一张 "座位牌"。比如导出用户信息:

@Data public class UserExcelVO { // 这里是表头名称,宽度设置成20,就像给单元格定制合适的衣服尺码 @ExcelProperty(value = "用户ID", index = 0) private Long userId; // 用转换器把日期变成"yyyy-MM-dd"格式,不然Excel会显示成奇怪的数字 @ExcelProperty(value = "注册时间", index = 1) @DateTimeFormat("yyyy-MM-dd") private Date registerTime; // 自定义转换器,把性别0/1转成"男""女",不然产品经理会追着你改需求 @ExcelProperty(value = "性别", index = 2) @Converter(SexConverter.class) private Integer sex; }

这里的@ExcelProperty就像给数据贴标签,index是列顺序,可别标错号,不然数据错位时你会怀疑人生 —— 我曾把金额和年龄的位置搞反,被财务小姐姐骂得狗血淋头。

3. 编写导出工具类:把重复工作打包成 "瑞士军刀"

把通用导出逻辑封装起来,以后每次导出就像拧瓶盖一样简单。创建EasyExcelUtils

public class EasyExcelUtils { public static <T> void exportExcel(HttpServletResponse response, List<T> dataList, Class<T> clazz, String fileName) throws IOException { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 文件名得处理中文,不然下载下来是乱码,别问我怎么知道的(摸了摸头上的包) fileName = URLEncoder.encode(fileName, "UTF-8").replaceAll("\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); // 这里用EasyExcel.write()就像启动一个Excel生成器,简单到让我怀疑人生 EasyExcel.write(response.getOutputStream(), clazz) .sheet("数据报表") .doWrite(dataList); } }

从此告别每次导出都写重复代码的日子,就像有了自动咖啡机,再也不用手动磨豆子了。

02

实战演练:从 "普通导出" 到 "花里胡哨" 的需求突围

1. 基础导出:先搞定 "刚需"

在 Controller 里调用工具类,就像把食材放进微波炉:

@GetMapping("/exportUser") public void exportUser(HttpServletResponse response) throws IOException { List<UserExcelVO> dataList = userService.getUserListForExport(); // 假设这是从数据库查的数据 EasyExcelUtils.exportExcel(response, dataList, UserExcelVO.class, "用户信息表"); }

第一次跑通时,我对着屏幕傻笑了三分钟 —— 七年了,终于不用跟 POI 的 N 个参数较劲了!

2. 复杂表头:当领导突然说 "再加一层分类"

有时候表头需要多级结构,比如 "用户信息" 下分 "基本信息"" 联系方式 "。这时候需要用@ExcelProperty的数组形式:

@Data public class ComplexHeaderVO { @ExcelProperty({"用户信息", "用户ID"}) private Long userId; @ExcelProperty({"用户信息", "姓名"}) private String userName; @ExcelProperty({"联系方式", "手机号"}) private String phone; @ExcelProperty({"联系方式", "邮箱"}) private String email; }

看着生成的两层表头,突然想起当年被产品经理临时加需求的夜晚,而现在,EasyExcel 让我能优雅应对,甚至想主动问:"还有什么花样?爸爸接得住!"

3. 合并单元格:玩一把 "Excel 拼图游戏"

比如导出报表时需要合并相同内容的单元格,这时候得自定义CellWriteHandler。举个例子,合并连续相同的部门名称:

public class MergeCellHandler implements CellWriteHandler { @Override public void afterCellDispose(CellWriteHandlerContext context) { // 这里省略具体实现,核心是通过行号和列号判断是否合并 // 就像拼拼图,找到相同的部分粘在一起 } }

在导出时注册这个处理器:

EasyExcel.write(...) .registerWriteHandler(new MergeCellHandler()) .doWrite(...);

第一次实现合并单元格时,我兴奋地在工位上哼起了《爱拼才会赢》,毕竟以前用 POI 写合并代码能写满两屏,现在轻松多了。

4. 自定义格式:让数据 "穿上漂亮衣服"

比如金额需要显示成 "¥1,000.00",日期要显示成 "2025 年 5 月 29 日"。除了前面提到的@DateTimeFormat,数值格式可以用@NumberFormat

@ExcelProperty("金额") @NumberFormat("#,##0.00") private Double amount;

看着导出的规范格式,突然想起当年因为金额格式不对被财务打回 13 次的惨案,现在终于能扬眉吐气了。

5. 大数据量导出:别让内存 "撑破肚皮"

当数据量超过 10 万条时,直接导出会把内存撑爆,这时候得用流式处理。EasyExcel 贴心地支持分页导出,每次查 1000 条,分批次写入:

EasyExcel.write(response.getOutputStream(), UserExcelVO.class) .sheet("大数据报表") .registerWriteHandler(...) // 可选的样式处理器 .doWrite(new AnalysisContext() -> { // 这里每次调用获取一页数据,直到没有数据为止 List<UserExcelVO> pageData = userService.getPageData(analysisContext.readRowHolder().getRowIndex()); return pageData; });

记得当年用 POI 导出 20 万条数据,服务器直接内存溢出,被运维大哥拎着键盘来问罪,现在有了流式处理,再也不怕大数据量了。

03

避坑指南:这些 "暗礁" 别踩

1. 依赖冲突:当 Maven 开始 "闹别扭"

如果引入了旧版 POI 依赖,可能会和 EasyExcel 的 POI 版本冲突。这时候别慌,用mvn dependency:tree命令排查,然后在pom.xml里用排除冲突项,就像哄孩子一样,把捣乱的依赖赶走。

2. 注解优先级:别让 "标签" 打架

@ExcelProperty可以写在字段上或方法上,建议统一写在字段上,不然容易混乱。我曾在一个类里混合使用,结果导出时字段顺序乱成一锅粥,debug 了两小时才发现问题。

3. 样式设置:别把 Excel 变成 "花脸猫"

虽然 EasyExcel 支持自定义样式,但别过度使用,比如给每个单元格设置不同颜色,导出的 Excel 可能打不开。样式设置要适度,就像化妆,自然美才是真的美。

04

总结:从 "被 Excel 支配" 到 "掌控导出自由"

折腾了七年 Excel 导出,从 POI 的磕磕绊绊到 EasyExcel 的丝滑体验,不得不感叹开源工具的伟大。现在每次接到导出需求,我都能淡定地说:"放马过来吧,不管是复杂表头、大数据量还是格式要求,咱这工具都能搞定。"

最后送大家一句口诀:EasyExcel 真的妙,注解一标数据跳,工具类里封装好,导出从此没烦恼。复杂需求别害怕,处理器来把忙帮,踩过的坑我来扛,各位兄弟放心上!

如果你在整合过程中遇到什么奇怪的问题,欢迎留言交流 —— 毕竟我这七年攒了一箩筐的导出故事,咱们慢慢唠。现在,打开你的 IDE,试试用 EasyExcel 导出第一份数据吧,相信我,你会爱上这种轻松的感觉!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 3:41:13

基于单片机的光控窗帘控制系统设计

基于单片机的光控窗帘控制系统设计 一、设计背景与意义 在智能家居快速发展的当下&#xff0c;窗帘作为室内重要的遮阳与采光部件&#xff0c;其控制方式正从传统手动向自动化、智能化升级。传统手动窗帘操作繁琐&#xff0c;难以根据光线变化实时调节&#xff0c;而现有部分…

作者头像 李华
网站建设 2026/5/1 7:56:20

工程材料行业TOB企业获客软件选型与技术实践深度解析

在数字化转型浪潮席卷各行各业的今天&#xff0c;工程材料这一传统基础行业也面临着深刻的营销模式变革。与消费品行业不同&#xff0c;工程材料企业的客户群体高度专业化、决策链条长、采购行为理性且注重长期合作&#xff0c;其业务核心是典型的B2B模式。然而&#xff0c;传统…

作者头像 李华
网站建设 2026/5/1 8:03:09

AI 智能体高可靠设计模式:层级代理组

优化智能体解决方案需要软件工程确保组件协调、并行运行并与系统高效交互。例如预测执行[2]&#xff0c;会尝试处理可预测查询以降低时延&#xff0c;或者进行冗余执行[3]&#xff0c;即对同一智能体重复执行多次以防单点故障。 优化智能体解决方案需要软件工程确保组件协调、并…

作者头像 李华
网站建设 2026/4/18 13:30:38

企业级农商对接系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 随着农业产业化和数字化进程的加速推进&#xff0c;传统农商对接模式在信息传递、资源整合及交易效率方面面临诸多挑战。农产品供需信息不对称、流通环节冗长、交易成本高等问题制约了农业经济的发展。在此背景下&#xff0c;构建一套高效、智能的企业级农商对接系统成为优…

作者头像 李华
网站建设 2026/4/18 5:39:03

计算机毕业设计springboot校园自助商城系统 基于SpringBoot的校园综合服务交易平台 SpringBoot框架下的高校自助跳蚤市场与跑腿商城

计算机毕业设计springboot校园自助商城系统vz1x59 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“宅经济”与“共享”成为校园生活的主旋律&#xff0c;学生既渴望随时买到平…

作者头像 李华