使用Apache POI+StreamingReader无法创建FormulaEvaluator的问题求助
问题解答:无法通过StreamingReader创建FormulaEvaluator
很遗憾的告诉你——你没法直接用这个StreamingReader对应的StreamingWorkbook来创建FormulaEvaluator,原因很直接:
这个xlsx-streamer库(也就是你依赖的com.monitorjbl.xlsx包)是为了处理超大Excel文件、最大化降低内存占用设计的,它并没有实现Apache POI Workbook接口的全部方法。从你抛出的异常就能看出来:StreamingWorkbook.getCreationHelper()方法直接抛出了UnsupportedOperationException,根本没有提供创建辅助类(包括公式计算器)的能力。
可行的替代方案
根据你的场景,有两种处理思路:
- 如果文件能放进内存:改用POI标准实现
如果你的Excel文件体积没有大到必须流式读取的程度,直接用POI原生的XSSFWorkbook就能正常创建公式计算器,代码修改如下:InputStream inputStream = new FileInputStream(file); XSSFWorkbook workbook = new XSSFWorkbook(inputStream); FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); // 后续的公式计算、单元格处理逻辑 - 必须流式读取:手动处理公式计算
要是文件实在太大,只能用流式读取,那得自己来处理公式:- 流式读取时,先提取单元格的公式字符串(通过
Cell.getCellFormula()); - 可以借助POI的
FormulaParser解析公式结构,然后自己实现简单的计算逻辑,或者引入专门的Excel公式计算类库来求值; - 另一种变通方法:把需要计算的公式和依赖的单元格值提取出来,放到一个临时的小型
XSSFWorkbook中,用标准的FormulaEvaluator来计算结果。
- 流式读取时,先提取单元格的公式字符串(通过
补充说明
xlsx-streamer的核心优势是流式逐行读取,避免加载整个文档到内存,但代价就是放弃了POI很多需要完整文档上下文的功能,公式计算、样式处理这类操作都不在它的支持范围内,使用前得先确认它的功能边界是否匹配你的需求。
内容的提问来源于stack exchange,提问作者Joseph Roy
相关产品推荐
相关产品推荐

