在评估工作簿中的单元格时,我看到异常的错误。就上下文而言,POI用于使用定义的名称将值输入excel工作簿。然后,Excel接受输入,并进行各种计算和查找,以计算出一组输出量,根据对应的美国州,对输出量的处理方式有所不同。我看到的问题是,当评估一组特定的图纸时(在此情况下,我们将使用佛罗里达州),其单元格的评估结果为org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
,从而破坏了所有输出值。通常,当我得到不正确的输出时,可以通过在插入所有输入之后保存电子表格,评估工作簿(使用evaluateAll()
),然后将更新的“调试器”版本保存到本地计算机中来快速找到它们。但是,与此有关的问题是,当我检查更新的版本时,我的输出量似乎已成功计算,并且看不到任何#RREF!错误在工作簿中的任何地方。
使用各种输入值组合(表明仅指向一组特定的纸页)会导致错误。
更改通过FormulaEvaluators evaluateFormulaCell(cell)
函数对工作表进行评估的方式,然后在将cellValue作为字符串返回的开关中解析响应,以简单地使用evaluateAll()
。
删除所有到工作簿的外部链接,并删除可能麻烦的工作表上的条件格式。
启用POI日志以尝试查找问题的根本原因。
在执行评估之前,使用FormulaEvaluator clearAllCachedResultValues()
清除缓存的值。
最后,请确保没有任何电子表格包含带有FunctionEval getSupportedFunctionNames()
和getNotSupportedFunctionNames()
的任何不受支持的POI公式。
这些是显示ErrorEval [#REF!]问题的第一批POI日志。
...
DEBUG - Evaluated Assumed Census!C41 to org.apache.poi.ss.formula.eval.NumberEval [0.0714285714285714]
DEBUG - Evaluated Lookup Table 1!D41 to org.apache.poi.ss.formula.eval.NumberEval [0.0662525879917184]
DEBUG - Evaluated Lookup Table 1!E41 to org.apache.poi.ss.formula.eval.NumberEval [0.13768115942029]
DEBUG - Evaluated Lookup Table 1!E57 to org.apache.poi.ss.formula.eval.NumberEval [0.0196687370600414]
DEBUG - Evaluated Calc Table 2 FL!O4 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!O88 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!E165 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!D165 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!D198 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!Q4 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!Q88 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!E167 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!D167 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!D200 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!P4 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!R4 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Calc Table 2 FL!R88 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
DEBUG - Evaluated Input Sheet!E168 to org.apache.poi.ss.formula.eval.ErrorEval [#REF!]
...
此外,这也是当前评估电子表格的方式。
when (evaluator.evaluateFormulaCell(cell)) {
CellType.NUMERIC -> cell.numericCellValue
CellType.STRING -> cell.stringCellValue.toString().toDoubleOrNull() ?: 0.0
CellType.BOOLEAN -> cell.booleanCellValue.toString().toDoubleOrNull() ?: 0.0
CellType.ERROR -> cell.errorCellValue.toString().toDoubleOrNull() ?: 0.0
else -> cell.toString().toDoubleOrNull() ?: 0.0
}
期望的结果是调试器工作表的输出单元上的值,但是结果中的输出值为0或23。调试器电子表格不包含任何#REF!输入处理完并由POI评估后出现错误,而是显示了我通常期望的有效值。
更新:还尝试在switch语句中更改评估以使用evaluator.evaluate(cell).cellType
,现在调试器电子表格显示#REF!到处;但是,看到excel中的所有错误并不能真正表明其根本原因。手动输入值时,电子表格也可以正确计算。
答案 0 :(得分:0)
在Calc Table 2 FL
工作表中,OFFSET
公式用于非常大的查询(超过255列)。在深入研究createOffset
的Apache POI源代码之后,我们能够找到以下内容:
if (absRows.isOutOfBounds(0, 65535)) {
throw new EvaluationException(ErrorEval.REF_INVALID);
}
因此,对于POI,此函数中的列数有意限制。我不知道为什么,但一定会想听听它为什么存在