SXSSF 工作簿中的 Apache POI 评估公式

Apache POI Evaluate Formula in SXSSF workbook

在我的项目中,我使用 SXSSFWorkbook (Apache-POI 3.9) class 来管理大型电子表格。 现在我需要计算一些单元格的公式,所以我尝试使用像这样的 FormulaEvaluator

...
SXSSFWorkbook streamingWorkbook = new SXSSFWorkbook(100);
...
FormulaEvaluator fe = streamingWorkbook.getCreationHelper().createFormulaEvaluator();
...
fe.evaluateInCell(cell);

但是这样做会抛出异常

java.lang.ClassCastException: org.apache.poi.xssf.streaming.SXSSFCell cannot be cast to org.apache.poi.xssf.usermodel.XSSFCell
at     org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.evaluateInCell(XSSFFormulaEvaluator.java:177)
at org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator.evaluateInCell(XSSFFormulaEvaluator.java:44)

...

此错误的直接原因很明显:方法 .evaluateInCell 接受一个 Cell 对象,但在内部将 Cell 转换为 XSSFCell。因为我传递的是 SXSSFCell 异常被抛出。

所以问题是:有没有办法在流式工作簿(SXSSF)中实现公式评估?

只需尝试添加以下依赖项,看起来您缺少 XSSF 的其他 jar

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>????</version>
</dependency>

TL;DR - 您需要的支持不在您正在使用的旧 3.9 版本中,因此您需要升级到 3.13 beta 2 或更高版本。

您的问题是您使用的 Apache POI 版本太旧。这就是为什么在尝试评估 SXSSF 单元格时出现异常的原因。由于detailed towards the end of the Formula Evaluation documentation,对于SXSSF公式评估,您需要使用3.13 beta 2或更高版本。

但要注意一件事 - 公式求值不仅需要包含公式的单元格在内存中,还需要它引用的任何其他单元格,以及它们引用的任何单元格。因此,调用 FormulaEvaluator.evaluateAll() 不太可能奏效;您通常需要在写入后一个一个地评估单元格。您还会遇到到处引用的公式,因为它们仅在它们引用的单元格在当前 window 中并且尚未刷新到磁盘时才有效。

显示问题的下图(在 SXSSF 中你不能计算公式)