我有一个包含大量公式的工作簿,包括依赖于依赖于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)