当前位置: 首页 > 知识库问答 >
问题:

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

邹书
2023-03-14

在计算工作簿中的单元格时,我看到了不寻常的错误。对于上下文,POI被用于使用定义的名称将值输入到excel工作簿中。Excel然后接收输入,并进行各种计算和查找来计算一组输出量,根据它对应的美国州的不同,处理方式不同。我看到的问题是,当评估一组特定的工作表时(在本上下文中,我们将使用佛罗里达州),它们的单元格的值为org.apache.poi.ss.formula.eval.ErrorEval[#REF!],从而中断所有输出值。通常情况下,当我得到不正确的输出时,我可以通过在插入所有输入后保存电子表格、评估工作簿(使用评估所有()),然后将更新的“调试器”版本保存到本地机器来快速找到它们。然而,这个问题是,当我检查更新的版本时,我的输出量似乎已经成功计算,并且我在工作簿中的任何地方都没有看到任何#RREF!错误。

使用各种输入值组合,这表明只指向一组特定的页导致错误。

从FormulaEvaluatorsevaluateFormulaCell(cell)函数更改工作表的求值方式,然后解析以字符串形式返回cellValue的开关中的响应,只需使用evaluateAll()

删除所有指向工作簿的外部链接,并删除潜在麻烦工作表上的条件格式。

启用POI日志以尝试查找问题的根本原因。

在执行计算之前,使用FormulaEvaluatorclearAllCachedResultValues()清除缓存的值。

最后,确保所有电子表格都不包含任何不受支持的POI公式,包括FunctionEvalgetSupportedFunctionNames()getNotSupportedFunctionNames()

这是第一个显示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。调试器电子表格在使用输入进行处理并由POI评估后不包含任何#REF!错误,相反,它显示了我通常期望的有效值。

更新:还尝试将evaluate更改为使用evaluator。评估(细胞)。在switch语句中输入cellType,现在调试器电子表格显示#REF!处处然而,看到excel中的所有错误并不能真正帮助指出问题的根本原因。手动输入值时,电子表格也能正确计算。

共有1个答案

况谦
2023-03-14

Calc Table 2 FL表中,OFFSET公式用于非常大的查询(超过255列)。在深入研究了createOffset的Apache POI源代码后,我们发现:

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

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

 类似资料:
  • 我遇到了这个问题,只适用于,如果我把它拿出来,它停止工作问题。 使用setTimeout的示例 JXS 我已经按照这个例子React集中在渲染后的输入 渲染函数

  • 问题内容: 我问这个问题是因为我知道以下检查列表是否为空的pythonic方法: 将打印等,所以这让我找出与真值; 但是,如果我尝试将[]和False直接“比较”,则会获得以下信息: 等等… 这里发生了什么?我觉得我确实缺少一些明显的东西。 问题答案: 该语句在布尔上下文中评估所有内容,就像对内置函数的隐式调用一样。 这是您实际检查语句如何评估事物的方式: 参见真值测试文档,空列表被 认为是错误的

  • 我对VBA相当陌生,请放心。我试图设置一种方法,从一个单元格区域(总是相同的)获取数据,并将这些数据输入到现有的主工作簿中。 null

  • 当在列中单击文本“发送调查”时,我正在尝试从工作表“”上的活动行复制单元格b中的值,并将其粘贴到单元格中。A2在我的另一个工作簿“”上的“”表。 由于某种原因,我没有收到任何错误,但是没有任何内容被粘贴到我的其他工作簿的单元格A2中。 有人能告诉我哪里出了问题吗。提前感谢

  • ref

    描述 (Description) 如果EXPR或$ _(如果未提供EXPR)是引用,则此函数返回true值。 返回的实际值还定义了引用引用的实体类型。 内置类型是 - REF SCALAR ARRAY HASH CODE GLOB LVALUE IO::Handle 如果变量被bless()函数祝福,那么将返回新的数据类型。 新数据类型通常是类名。 语法 (Syntax) 以下是此函数的简单语法