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 中你不能计算公式)
在我的项目中,我使用 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 中你不能计算公式)