Apache POI:使用公式 FormulaEvaluator 读取单元格值时公式被删除
Apache POI : Formula gets removed while reading the cell value using formula FormulaEvaluator
我使用的是 3.17 版的 poi。在我的 java 代码中,我想读取一个具有公式的单元格值,我正在使用 FormulaEvaluator
的 evaluateInCell
函数来解析单元格值。
我的资源中有一个模板 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()
。如果没有这些,对 sheet 进行任何更改后的任何评估都可能失败。
我使用的是 3.17 版的 poi。在我的 java 代码中,我想读取一个具有公式的单元格值,我正在使用 FormulaEvaluator
的 evaluateInCell
函数来解析单元格值。
我的资源中有一个模板 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()
。如果没有这些,对 sheet 进行任何更改后的任何评估都可能失败。