我有一个包含大量公式的工作簿,包括依赖于依赖于VLOOKUP等的其他公式的结果的公式 . 所有这些都导致计算单个值 . 当我尝试通过POI 3.13获取值时,它是#VALUE! . 但是,如果我在Excel中打开工作簿,则会正确计算 .

在得到我需要的 Value 之前,我打电话给:

book.getCreationHelper().createFormulaEvaluator().evaluateAll();

根据文档,这应该解决这些问题 . Apache's documentation甚至调出#VALUE!具体问题,并建议上述步骤作为一个决议,但我不能让它工作 . 我没有得到任何公式例外 .

我也尝试在每次设置一个值后调用evaluateAll()(这个场景大约设置为100),仍然是#VALUE!

public boolean setValue(final int value, final String tabName, final int rowNum, final int colNum) {
    boolean returnVal;
    try {
        final Cell currentCell = getCell(tabName, rowNum, colNum);
        currentCell.setCellValue(value);
        currentCell.setCellType(Cell.CELL_TYPE_NUMERIC);
        book.getCreationHelper().createFormulaEvaluator().evaluateAll();
        returnVal = true;
    } catch (final Exception e) {
        logger.error("Exception setting value " + value + " on " + tabName + " " + rowNum + "," + colNum, e);
        returnVal = false;
    }
    return returnVal;
}

有问题的细胞有这个公式:

=SUM('VEH1'!H3+'VEH2'!H3+'VEH3'!H3+'VEH4'!H3)

所有细胞,如'VEH1'!H3,都有类似的公式来处理它们的特定表:

=IF('VEH1'!B10>0,SUM(H11:W11),0)

其中'VEH1'!B10中的值是1到4.H11到W11也是公式单元格,例如:

=H71+H40

H71是这样的:

=ROUND(H69*H39,2)

等等一系列美元 Value 乘以一些因子 Value . 因子值主要通过查找找到:

=IF(ISERROR(VLOOKUP($C26,LookupTable,3,FALSE)),1,VLOOKUP($C26,LookupTable,3,FALSE))

上面的 LookupTable 是另一个工作表上的命名子表 . 查找通常基于以下值:A)用户(或POI,在这种情况下)在单元格中输入的内容,或B)POI输入的几个单元格的组合,如= B1&B2&B3&B4

每个步骤重复几十次 . 基本上,我得到16个值的总和,其中16个中的每一个是52行的总和,其中大约一半是查找(许多具有各种IF条件逻辑块),另一半非常简单= ROUND(A1 * B1) ,2)公式 .

它似乎只是失败的最后一步,公式:

=SUM('VEH1'!H3+'VEH2'!H3+'VEH3'!H3+'VEH4'!H3)