后端【免费下载链接】fesodFast. Easy. Done. Processing spreadsheets without worrying about large files causing OOM.项目地址https://gitcode.com/gh_mirrors/fast/fesod点击查看免费下载Apache Fesod(Incubating) 的fesod-sheet模块提供了一套以POJO 注解为核心的电子表格读写 API。本文基于 quickstart/example.md 的官方示例完整讲解用FesodSheet一个类完成 Excel 读取与写入的最小可运行代码并结合仓库源码构建器、监听器、注解实现深入剖析每条 API 背后的调用链与扩展点。读完本文你将能在自己的 Maven/Gradle 项目中直接落地「监听式逐行读表」与「注解式模型写表」两套标准用法。前置准备引入 fesod-sheet 依赖fesod-sheet是独立于其他模块发布的核心组件通过 Maven 引入版本以 guide.md 中说明的当前版本2.0.2-incubating为准该版本支持 JDK8 至 JDK25dependency groupIdorg.apache.fesod/groupId artifactIdfesod-sheet/artifactId version2.0.2-incubating/version /dependencyGradle 用户对应写法dependencies { implementation org.apache.fesod:fesod-sheet:2.0.2-incubating }底层依赖 Apache POI 5.5.1Excel 处理、Apache Commons CSV 1.14.1CSV 支持与 Ehcache 3.9.11缓存。如果你的工程已引入过 POI 相关组件需要手动排除 POI 相关 jar 以避免版本冲突详见 guide.md。读取电子表格监听器模式逐行解析官方示例用「模型类 监听器」组合完成读取核心代码只有一行// Implement the ReadListener interface to set up operations for reading data public class DemoDataListener implements ReadListenerDemoData { Override public void invoke(DemoData data, AnalysisContext context) { System.out.println(Parsed a data entry JSON.toJSONString(data)); } Override public void doAfterAllAnalysed(AnalysisContext context) { System.out.println(All data parsed!); } } public static void main(String[] args) { String fileName demo.xlsx; // Read file FesodSheet.read(fileName, DemoData.class, new DemoDataListener()).sheet().doRead(); }读表入口FesodSheet.read 的多种重载FesodSheet是 Apache Fesod 电子表格处理的核心门面类源码见 FesodSheet.java其read方法根据数据来源提供多组重载重载适用场景read(String pathName)按文件路径读取read(File file)按文件对象读取read(InputStream inputStream)按输入流读取网络流、上传流等read(pathName/file/inputStream, Class head)指定表头模型类read(pathName/file/inputStream, Class head, ReadListener listener)指定模型类与读取监听器示例所用所有重载最终都会构造一个 ExcelReaderBuilder调用链为read(...)→new ExcelReaderBuilder().file(xxx).headIfNotNull(head).registerReadListenerIfNotNull(listener)即官方示例中的FesodSheet.read(fileName, DemoData.class, new DemoDataListener())等价于FesodSheet.read() .file(fileName) // 数据来源 .head(DemoData.class) // 模型类表头/字段映射依据 .registerReadListener(new DemoDataListener()) // 注册监听器 .sheet() // 选择工作表 .doRead(); // 触发读取监听器核心方法ReadListener 接口全解示例中的DemoDataListener实现了 ReadListener 接口。该接口定义了读取过程中的全部生命周期回调其中invoke与doAfterAllAnalysed是必须实现的两个方法void invoke(T data, AnalysisContext context)每解析出一行数据就回调一次。data就是当前行的模型对象与context.readRowHolder()中持有的行数据一致context是分析上下文可从中拿到行号、工作表、工作簿等运行期信息。void doAfterAllAnalysed(AnalysisContext context)所有数据解析完成后回调常用于收尾如关闭资源、统计总数、释放分页处理状态。default void invokeHead(MapInteger, ReadCellData? headMap, AnalysisContext context)表头行解析完成时回调可用于校验表头或做动态列名映射。default void onException(Exception exception, AnalysisContext context)任一监听器上报异常时触发如果在此抛出异常整个读取过程将终止。default void extra(CellExtra extra, AnalysisContext context)开启额外信息读取超链接、批注、合并单元格时回调。default boolean hasNext(AnalysisContext context)控制是否继续读取下一条数据返回false可提前终止其默认实现会依据numRows行数上限判断见 ReadListener.java。示例中打印数据使用了JSON.toJSONString(data)fastjson这是演示性写法实际工程中你也可以直接System.out.println(data)或调用 POJO 自身的toString()。触发读取sheet().doRead() 的底层链路.sheet()返回 ExcelReaderSheetBuilderdoRead()内部完成两件事public void doRead() { excelReader.read(build()); // 将 ReadSheet 参数交给 ExcelReader 执行 excelReader.finish(); // 收尾并关闭资源 }ExcelReader.read()会根据文件类型xlsx/xls/csv选择对应的 SAX 解析器如XlsxSaxAnalyser、XlsSaxAnalyser逐行解析解析出的每一行经转换器Converter转换为模型对象后回调invoke——这正是「流式读取、不把整个文件装入内存」的设计基础也是 Fesod 处理大文件不易 OOM 的关键。相关实现见 analysis/v07/XlsxSaxAnalyser.java 与 analysis/v03/XlsSaxAnalyser.java。读取常用可选项通过构建器链你还可以在sheet()之前或之上附加读取参数FesodSheet.read(fileName, DemoData.class, listener) .ignoreEmptyRow(false) // 是否忽略空行默认 true .numRows(100) // 最多读取 100 行含表头 .sheet(Sheet1) // 按名称选择工作表 .doRead();sheet()支持无参默认第一个工作表、sheet(Integer sheetNo)从 0 开始的下标与sheet(String sheetName)按名称。其余参数如password加密文件、charset仅 CSV 生效、readCache缓存策略控制内存占用、extraRead读取批注/超链接等额外信息、readDefaultReturn无模型类时的默认返回类型等均可从 ExcelReaderBuilder 查看完整定义。写入电子表格注解模型 一行写表官方示例用「注解模型类」描述表头与列再用一行doWrite落盘// Sample data class public class DemoData { ExcelProperty(String Title) private String string; ExcelProperty(Date Title) private Date date; ExcelProperty(Number Title) private Double doubleData; ExcelIgnore private String ignore; } // Prepare data to write private static ListDemoData data() { ListDemoData list new ArrayList(); for (int i 0; i 10; i) { DemoData data new DemoData(); data.setString(String i); data.setDate(new Date()); data.setDoubleData(0.56); list.add(data); } return list; } public static void main(String[] args) { String fileName demo.xlsx; // Create a Template sheet and write data FesodSheet.write(fileName, DemoData.class).sheet(Template).doWrite(data()); }模型类注解ExcelProperty 与 ExcelIgnore写入的核心是模型类上的注解源码见 ExcelProperty.javaExcelProperty(String[] value())定义表头名称。写入时若配置多个值会自动合并为多级表头读取时取最后一个作为列名。示例中ExcelProperty(String Title)即声明该字段对应名为 String Title 的列。ExcelProperty(index 2)指定列索引从 0 开始。index -1时按 Java 字段声明顺序排列字段排序优先级为index order 默认声明顺序。ExcelProperty(order N)显式指定列排序权重。ExcelProperty(converter XxxConverter.class)为该字段强制指定类型转换器默认走AutoConverter自动匹配。ExcelIgnore标记字段完全忽略不参与读写源码见 ExcelIgnore.java。示例中的ignore字段因此不会出现在生成的表格中。仓库测试模块中可找到对应的模型样本例如 readwrite/DemoData.java 使用 Lombok 的Getter/Setter/EqualsAndHashCode简化样板代码并注明「字段顺序与 Excel 列顺序一一对应」——这正是默认排序index -1时的工作机制。写表入口FesodSheet.write 的多种重载与read对称FesodSheet.write也提供多组重载源码见 FesodSheet.java重载适用场景write(String pathName)写入文件路径write(File file)写入文件对象write(OutputStream outputStream)写入输出流如 HTTP 响应下载write(pathName/file/outputStream, Class head)指定表头模型类示例所用write(...)同样采用构建器模式new ExcelWriterBuilder().file(xxx).headIfNotNull(head)。写入过程由 ExcelWriterBuilder 配置inMemory(Boolean)是否全内存写表默认false——即默认先写缓存文件再输出避免大文件 OOM注释Comment与富文本RichTextString仅在内存模式下支持。password(String)写加密文件。注意加密需要将整个文件读入内存非常耗内存。withTemplate(...)基于模板文件写出模板同样会被读入内存超大模板可能 OOM。writeExcelOnException(Boolean)即使写出过程中抛异常也保留已生成的文件默认false。charset(Charset)/withBom(Boolean)仅 CSV 生效控制编码与 BOM 前缀避免 Office 打开乱码默认true。指定工作表与触发写出sheet(Template).doWrite(data())示例中.sheet(Template)创建名为Template的工作表sheet(String sheetName)等价于sheet(Integer sheetNo)按下标或sheet()使用默认表。之后调用doWrite(data())一次性写入整个ListDemoData。其底层调用链见 ExcelWriterSheetBuilder.java为excelWriter.write(data, build()); // 执行写入 excelWriter.finish(); // 完成并刷新输出写入时模型类按注解生成表头行随后逐行通过写转换器WriteConverter把字段值转换为单元格内容。ExcelWriterSheetBuilder还提供两个进阶入口doWrite(SupplierCollection? supplier)延迟取数适合数据量较大、需要按需生成数据的场景。doFill(Object data)/doFill(Object data, FillConfig fillConfig)基于模板做数据填充fill对应 write/metadata/fill 下的填充实现。table()/table(Integer tableNo)在同一 sheet 上追加写多张数据表见 ExcelWriterTableBuilder。另外写入时 sheet 名称会经过长度校验若超过 MS Excel 允许的最大长度Workbook.MAX_SENSITIVE_SHEET_NAME_LENsensitiveSheetName会将其截断并输出告警日志防止生成非法文件名见 ExcelWriterSheetBuilder.java。进阶一行同步读取全部数据监听器模式适合逐行流式处理如果你希望像普通方法调用一样直接拿到ListTFesod 提供了同步读取入口见 ExcelReaderSheetBuilder.javaListDemoData list FesodSheet.read(demo.xlsx, DemoData.class) .sheet() .doReadSync();doReadSync()内部注册一个内置的SyncReadListener读取完成后一次性返回结果列表。由于是全量收集到内存doReadSync()更适合中小文件大数据量场景仍建议使用监听器模式配合hasNext()/分页读取控制内存。结合测试官方读写场景的佐证仓库测试模块中大量测试直接采用与示例相同模式的 API 调用可作为学习参照readwrite/DemoDataTest.java基础模型读写往返测试core/SimpleDataTest.java最简单模型的无注解读写测试head/ComplexHeadDataTest.java多级表头ExcelProperty多值合并场景sheet/WriteSheetTest.java多工作表写入场景。这些测试展示了从「无注解简单模型」到「复杂表头、多 sheet、填充、样式」的渐进用法是官方示例之外的最佳扩展阅读材料完整清单见 website/docs/sheet 目录下的 read/write 专题文档。小结围绕官方 quickstart 示例本文完整落地了 Fesod Sheet 的两条核心操作链路读取FesodSheet.read(来源, 模型类, 监听器).sheet().doRead()通过ReadListener的invoke/doAfterAllAnalysed等回调以流式方式逐行消费数据写入FesodSheet.write(目标, 模型类).sheet(工作表名).doWrite(数据列表)通过ExcelProperty/ExcelIgnore注解声明表头与列映射构建器内部自动完成生成与落盘。两者都遵循「门面类 → 构建器 → 执行器」的分层设计既保证了一行代码的上手体验又通过构建器暴露了大量可调参数行数限制、缓存、加密、模板、内存模式等是进入 Fesod Sheet 更高级特性样式、合并、填充、自定义转换器的良好起点。赞分享后端【免费下载链接】fesodFast. Easy. Done. Processing spreadsheets without worrying about large files causing OOM.项目地址https://gitcode.com/gh_mirrors/fast/fesod点击查看免费下载相关推荐如何快速上手Apache Fesod5个高效处理Excel的终极秘诀如何快速上手Apache Fesod5个高效处理Excel的终极秘诀 Apache Fesod是一款专门为解决大规模Excel文件处理而设计的高性能Java库后端Pinpoint JBoss/WildFly 插件接入指南pinpoint.config 配置、独立/域模式部署与源码原理Pinpoint JBoss/WildFly 插件接入指南pinpoint.config 配置、独立/域模式部署与源码原理 导读 本文基于 Pinpoint后端Apache Fesod入门指南10分钟学会高性能Excel读写操作Apache Fesod入门指南10分钟学会高性能Excel读写操作 Apache Fesod是easyexcel作者最新升级版本一款快速、简洁、解决大文件后端上一篇10up Engineering Best Practices移动优先响应式设计实现方案终极指南下一篇免费重复文件清理指南Krokiet 如何用 4 种识别模式找出你磁盘里的冗余创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考