我正在使用poi版本3.17。在我的Java代码中,我想读取具有公式的单元格值,并且正在使用evaluateInCell
的FormulaEvaluator
函数来解析该单元格值。
我在资源中有一个模板excel,其中的单元格具有公式,如果我从中创建一个工作簿并设置一些值,然后尝试读回它,则FormulaEvaluator
会解析该单元格并输入实际值,由此这些单元格的公式将替换并更新为实际值。为什么?
我已经看到了evaluateInCell
功能的实现,有意将单元格类型设置为setCellType(cell, cv);
public XSSFCell evaluateInCell(Cell cell) {
if (cell == null) {
return null;
} else {
XSSFCell result = (XSSFCell)cell;
if (cell.getCellType() == 2) {
CellValue cv = this.evaluateFormulaCellValue(cell);
setCellType(cell, cv);
setCellValue(cell, cv);
}
return result;
}
}
为什么库这样做,并从单元格中删除实际公式。
有不同的功能:
CellType evaluateFormulaCell(Cell cell) - your cell will hold both the formula, and the result.
Cell evaluateInCell(Cell cell) - you cell will contain result only, formula is erased.
CellValue evaluate(Cell cell) - the formula is evaluated and returned. No changes in the cell.
void evaluateAll() = mass evaluateFormulaCell for the whole book.
显然,您已将evaluateInCell
取为evaluateFormulaCell
。 evaluateInCell
非常有用,不仅用于计数-将其用于清除配方。
此外,请不要忘记clearAllCachedResultValues()
或notifyUpdateCell()
/ notifySetFormula()
。如果没有这些内容,则在工作表上进行任何更改之后的任何评估都将失败。