Apache POI将单元格评估为ErrorEval [#REF!],但结果工作簿中没有任何#REF !!错误

时间:2019-06-07 20:56:56

标签: kotlin apache-poi apache-poi-4

在评估工作簿中的单元格时,我看到异常的错误。就上下文而言,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中的所有错误并不能真正表明其根本原因。手动输入值时,电子表格也可以正确计算。

1 个答案:

答案 0 :(得分:0)

Calc Table 2 FL工作表中,OFFSET公式用于非常大的查询(超过255列)。在深入研究createOffset的Apache POI源代码之后,我们能够找到以下内容:

    if (absRows.isOutOfBounds(0, 65535)) {
        throw new EvaluationException(ErrorEval.REF_INVALID);
    }

因此,对于POI,此函数中的列数有意限制。我不知道为什么,但一定会想听听它为什么存在