👉 这是一个或许对你有用的社群
🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事上“练” 《互联网高频面试题》:面朝简历学习,春暖花开 《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题 《精进 Java 学习指南》:系统学习,互联网主流技术栈 《必读 Java 源码专栏》:知其然,知其所以然

👉这是一个或许对你有用的开源项目
国产Star破10w的开源项目,前端包括管理后台、微信小程序,后端支持单体、微服务架构
RBAC权限、数据权限、SaaS多租户、商城、支付、工作流、大屏报表、ERP、CRM、AI大模型、IoT物联网等功能:
多模块:https://gitee.com/zhijiantianya/ruoyi-vue-pro 微服务:https://gitee.com/zhijiantianya/yudao-cloud 视频教程:https://doc.iocoder.cn 【国内首批】支持 JDK17/21+SpringBoot3、JDK8/11+Spring Boot2双版本
来源:
一年三连跳:EasyExcel → FastExcel → Apache Fesod 横向对比:5 个 Excel 处理方案怎么选 3 个研发场景:什么时候它顶用 接入 3 步:依赖 + 实体类 + 监听器 核心 API:写、读、转 PDF 迁移指南:从 EasyExcel / FastExcel 切到 Fesod 4 个真实使用边界 我的判断

一年三连跳:EasyExcel → FastExcel → Apache Fesod
Java 圈最常用的 Excel 库,过去一年完成了一次罕见的「三连跳」:
2024 年底 :阿里官宣 EasyExcel 不再维护 ——5 年的头牌库进入「祝它好运」状态; 2024-2025 :原作者离开阿里后推出 FastExcel ——API 完全兼容,主打「换 import 就能切」; 2025-2026 :FastExcel 再次"消失" ——原作者把项目整套捐给了 Apache 软件基金会 ,更名为 Apache Fesod (Incubating) 。最新版本 2.0.1-incubating已于 2026-02-11 发布。

很多人一脸懵——「上次刚换完 import,怎么又没了?」
别紧张 :这次不是停更,是升级到 Apache 一级开源项目 ——代码所有权从个人 / 公司转给基金会,长期维护、版本节奏跟 Apache POI、Maven、Tomcat 一个待遇 。这是开源项目能拿到的最好结局。
说白了:它不是「比 FastExcel 更强的另一个轮子」,是「FastExcel 拿到了 Apache 终身保障」 ——对存量项目,是迁移成本最低、最值得切的接班选项。
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/ruoyi-vue-pro 视频教程:https://doc.iocoder.cn/video/
横向对比:5 个 Excel 处理方案怎么选
把过去 5 年常见的 5 个方案放一张表,差距一目了然:
| Apache POI | 十万行级写入容易 OOM | |||
| POI SXSSF | ||||
| HuTool ExcelReader / Writer | ||||
| EasyExcel | 2024 年起阿里停更 | |||
| FastExcel | 2025 年捐给 Apache、更名 Fesod | |||
| Apache Fesod (本文) | Apache 孵化中 |
判断很简单 :
新项目 → 直接 Apache Fesod ,少一次后续迁移; 现有 EasyExcel / FastExcel 项目 → 切 Fesod,三步走(换坐标 + 改 import + 换入口类,详见「迁移指南」); 极简场景 (几行 Excel) → HuTool 一行调用即可,别上重武器; 要做 Excel 转 PDF → Fesod 内置该能力,省得自己拼 itext。
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
项目地址:https://github.com/YunaiV/yudao-cloud 视频教程:https://doc.iocoder.cn/video/
3 个研发场景:什么时候它顶用
场景 1:百万行报表导出
财务、风控、运营部门要导出数十万到百万级订单数据。直接用 POI 一定 OOM ——内存里塞百万 row 对象毕竟撑不住。
@GetMapping("/export/orders")publicvoidexportOrders(HttpServletResponse resp)throws IOException { resp.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); String name = URLEncoder.encode("orders", "UTF-8"); resp.setHeader("Content-disposition", "attachment;filename*=utf-8''" + name + ".xlsx");// 流式写入——分页查 DB 边读边写try (ExcelWriter writer = FesodSheet.write(resp.getOutputStream(), Order.class).build()) { WriteSheet sheet = FesodSheet.writerSheet("订单").build();int page = 0, pageSize = 5000;while (true) { List<Order> data = orderMapper.pageQuery(page++, pageSize);if (data.isEmpty()) break; writer.write(data, sheet); } }}收益 :流式写 + 分页查 DB(每批 5000 条),百万行导出内存稳定在 100MB 量级。
场景 2:用户上传 Excel 批量数据
客户给的 Excel 一上传上来就是上万行,逐行 INSERT DB 慢、一次性 readAll 又 OOM。Fesod 的事件监听器是为这个场景设计的:
publicclassOrderBatchListenerextendsAnalysisEventListener<OrderRow> {privatefinal List<OrderRow> buffer = new ArrayList<>();privatestaticfinalint BATCH_SIZE = 500;privatefinal OrderMapper mapper;publicOrderBatchListener(OrderMapper mapper){ this.mapper = mapper; }@Overridepublicvoidinvoke(OrderRow row, AnalysisContext ctx){ buffer.add(row);if (buffer.size() >= BATCH_SIZE) { mapper.batchInsert(buffer); buffer.clear(); } }@OverridepublicvoiddoAfterAllAnalysed(AnalysisContext ctx){if (!buffer.isEmpty()) mapper.batchInsert(buffer); }}关键设计 :500 条凑一批 batchInsert——既不让 buffer 撑爆内存,又能利用批插提速。
场景 3:Excel 转 PDF(合同 / 工资单)
工资单、合同模板的常见诉求:导出的 Excel 同时给个 PDF 版方便归档 / 打印 。
FesodSheet.convertToPdf(new File("excelFile.xlsx"), new File("pdfFile.pdf"), null, null);底层依赖 Apache POI + itext-pdf——itext 商业用途需注意 AGPL 许可 ,企业项目要么走 itext 商业 license,要么换 OpenPDF。
接入 3 步:依赖 + 实体类 + 监听器
第 1 步:Maven 依赖(注意是 Apache 新坐标)
<dependency><groupId>org.apache.fesod</groupId><artifactId>fesod-sheet</artifactId><version>2.0.1-incubating</version></dependency>重点 :groupId 是 org.apache.fesod——和 EasyExcel 的 com.alibaba.excel、FastExcel 的 cn.idev.excel 都不同。新项目直接用 Apache 坐标,少一次后续迁移 。
第 2 步:实体类(@ExcelProperty 注解列名)
import org.apache.fesod.sheet.annotation.ExcelProperty;@Setter@Getter@ToStringpublicclassUser{@ExcelProperty("编号") private Integer id;@ExcelProperty("名字") private String name;@ExcelProperty("年龄") private Integer age;}第 3 步:事件监听器(流式处理是真活)
publicclassBaseExcelListener<T> extendsAnalysisEventListener<T> {privatefinal List<T> dataList = new ArrayList<>();@Overridepublicvoidinvoke(T t, AnalysisContext ctx){ dataList.add(t); }@OverridepublicvoiddoAfterAllAnalysed(AnalysisContext ctx){ log.info("读取完成,共 {} 条", dataList.size()); }public List<T> getDataList(){ return dataList; }}注意 :监听器决定了内存模型。生产用法应该在 invoke 里累积 + 批量落库,而不是无脑 dataList.add ——否则上百万行直接 OOM。
核心 API:写、读、转 PDF
写 :
FesodSheet.write(response.getOutputStream(), User.class) .sheet("模板") .doWrite(buildData());读 :
FesodSheet.read(file.getInputStream(), User.class, listener) .sheet() .doRead();Spring Boot 上传 + 处理 :
@PostMapping("/upload")public ResponseEntity<String> upload(@RequestParam("file") MultipartFile file) {if (file.isEmpty()) return ResponseEntity.badRequest().body("请选择文件");try { BaseExcelListener<User> listener = new BaseExcelListener<>(); FesodSheet.read(file.getInputStream(), User.class, listener).sheet().doRead(); log.info("上传 {} 条", listener.getDataList().size());return ResponseEntity.ok("处理成功"); } catch (IOException e) {return ResponseEntity.status(500).body("文件处理失败"); }}迁移指南:从 EasyExcel / FastExcel 切到 Fesod
Apache Fesod 官方建议分阶段迁移 ——先换坐标 + import,再换类名,每步都跑测试,降低风险。一张表对照三代变化:
| Apache Fesod(最新) | |||
|---|---|---|---|
| groupId | com.alibaba | cn.idev.excel | org.apache.fesod |
| artifactId | easyexcel | fastexcel | fesod-sheet |
| 版本 | 3.x | 1.x | 2.0.1-incubating |
| import 包 | com.alibaba.excel.* | cn.idev.excel.* | org.apache.fesod.sheet.* |
| 入口类 | EasyExcel | FastExcel | FesodSheet |
迁移步骤 :
改 pom :换 groupId / artifactId / version;全局替换 import :IDE 一次性 cn.idev.excel→org.apache.fesod.sheet(或com.alibaba.excel→ 同上);替换入口类 : FastExcel.read/write→FesodSheet.read/write;跑回归测试 :流式写、监听器读、合并单元格、多 sheet 全过一遍。
API 完全兼容 ——上层调用方式(@ExcelProperty 注解、AnalysisEventListener 监听器、ExcelWriter 写入器)一行不动。
4 个真实使用边界
边界 1:仍在 Incubating 阶段,API 微调可能(最常见)
2.0.1-incubating 是孵化器版本——Apache 孵化项目惯例是 API 还可能有小幅调整 。修法 :① pom 锁死具体版本号;② 关注 fesod.apache.org 的 release notes;③ 升级前在测试环境跑全套回归。
边界 2:监听器不要把数据全留在内存(常见)
新人最容易写错的代码:
// ❌ 上百万行直接 OOMpublicvoidinvoke(T t, AnalysisContext ctx){ dataList.add(t); }修法 :累积到 batch 阈值后立刻 flush(DB / 队列 / 文件),buffer 清空再继续。
边界 3:Excel 转 PDF 的 itext 许可(少见但破坏力大)
iText 7+ 是 AGPL 许可——商用项目不买商业 license 不允许闭源 。要避坑可以换 OpenPDF(LGPL)或 Aspose.PDF(商业)。法务环节别忽略 。
边界 4:和 FastExcel 1.x 二进制不兼容(高级场景)
虽然 API 兼容,但 FastExcel 1.x 和 Fesod 2.x 在 Maven 依赖树上是两个不同 artifact ——同一项目两个都引会出现类冲突。迁移时必须一刀切 :删掉 cn.idev.excel:fastexcel,只留 org.apache.fesod:fesod-sheet。
我的判断
EasyExcel → FastExcel → Apache Fesod 的三连跳,看着折腾,但走到 Apache 这一步意味着这个工具终于有了一个不会再"消失"的家 ——基金会保 license、社区保维护、长期 roadmap 由社区共治,不再受单家公司 / 单个作者影响。好的开源接班不是另起炉灶,是把已有的轮子继续往前转——这次干脆转进了 Apache,连维护权都不用再担心 。
仓库:github.com/apache/fesod | 官网:fesod.apache.org | 迁移指南:fesod.apache.org/docs/migration/from-fastexcel/

欢迎加入我的知识星球,全面提升技术能力。
👉 加入方式,“长按”或“扫描”下方二维码噢:

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。





文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
夜雨聆风