# Proposal: Replace Apache POI with Alibaba EasyExcel ## Summary 将若依框架中的 Apache POI 替换为 Alibaba EasyExcel,以解决大文本量 Excel 导入导出时的内存占用和性能问题。当前使用 POI 的 SXSSFWorkbook 虽然支持流式写入,但在处理大量数据时仍然存在性能瓶颈,且不支持真正的流式读取。 ## Motivation ### 问题分析 1. **当前 POI 实现的限制**: - `ExcelUtil.java:112` - `sheetSize` 硬编码为 65536,这是 Excel 2003 的限制 - `ExcelUtil.java:1682` - 使用 SXSSFWorkbook 进行流式写入,但内存优化有限 - `ExcelUtil.java:325-525` - `importExcel` 方法一次性加载整个 Sheet 到内存,无法处理大文件 - POI 的 DOM 解析模式导致大文件内存占用过高 2. **业务需求**: - 需要支持导入导出超过 10 万行数据 - 需要支持单元格内容超过 32767 字符(POI STRING 类型限制) - 需要降低内存占用,避免 OOM 3. **EasyExcel 优势**: - 基于 SAX 解析,真正的流式读写 - 内存占用仅与行数据大小相关,与文件大小无关 - API 设计简洁,注解驱动 - 官方维护活跃,社区成熟 ## Proposed Solution ### 技术方案 1. **保持 API 兼容性**: - 保留 `@Excel` 和 `@Excels` 注解接口 - 保留 `ExcelUtil` 的公共方法签名 - 保留 `ExcelHandlerAdapter` 接口(适配 EasyExcel 的写处理器) 2. **核心实现变更**: - 使用 `EasyExcel.write()` 替代 POI 的 Workbook/Sheet 操作 - 使用 `EasyExcel.read()` 替代 POI 的 Workbook 解析 - 实现自定义的 `HeadGenerator` 和 `ContentStyleStrategy` 以支持样式 3. **依赖变更**: - 移除 `poi-ooxml` 依赖 - 添加 `easyexcel` 依赖(版本 3.3.4,支持 Spring Boot 3) ### 影响范围 **修改的文件**: - `ruoyi-common/pom.xml` - 更新依赖 - `ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java` - 重写实现 - `ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java` - 调整注解属性 - `ruoyi-common/src/main/java/com/ruoyi/common/utils/poi/ExcelHandlerAdapter.java` - 适配新接口 **无需修改的文件**(向后兼容): - 所有 Controller 层代码(13 个文件使用 ExcelUtil) - 实体类上的 `@Excel` 注解 ## Alternatives Considered ### 方案 1:升级 POI 版本 - **优点**:代码改动最小 - **缺点**:无法从根本上解决内存问题,POI 的架构限制依然存在 ### 方案 2:使用 Hutool 的 Excel 工具 - **优点**:API 简洁 - **缺点**:底层仍使用 POI,内存问题未解决 ### 方案 3:使用 EasyExcel(选定方案) - **优点**:真正的流式处理,内存占用低,社区成熟 - **缺点**:需要适配现有注解和 API ## Compatibility Notes ### 破坏性变更 1. **样式支持**:EasyExcel 的样式支持有限,以下功能可能需要简化: - 合并单元格(`needMerge`) - 图片插入(`ColumnType.IMAGE`) - 数据验证(`combo`, `comboReadDict`) - 自定义颜色(`headerBackgroundColor`, `color` 等) 2. **Sheet 分割**:EasyExcel 自动处理大文件,无需手动分割 Sheet 3. **统计行**:`isStatistics` 需要通过监听器实现 ### 保留的功能 - ✅ 注解驱动配置 - ✅ 字典类型转换(`dictType`) - ✅ 表达式转换(`readConverterExp`) - ✅ 日期格式化(`dateFormat`) - ✅ 导入/导出模板生成 - ✅ 字段筛选(`includeFields`, `excludeFields`) ## Success Criteria 1. **性能指标**: - 导出 10 万行数据,内存占用 < 500MB - 导入 100MB Excel 文件,内存占用 < 200MB 2. **功能完整性**: - 所有现有 Controller 的导入导出功能正常工作 - 支持超过 65536 行数据 3. **兼容性**: - 现有实体类注解无需修改 - 现有业务代码无需修改 ## Timeline 阶段划分(具体任务见 tasks.md): 1. 依赖更新与环境准备 2. 核心 ExcelUtil 重写 3. 注解与接口适配 4. 集成测试与验证 5. 文档更新 ## Related Changes - 无前置依赖 - 可能影响:所有使用 Excel 导入导出的模块