excel - Apache POI:使用公式 FormulaEvaluator 读取单元格值时,公式被删除
问题描述
我正在使用 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()
。没有这些,对工作表进行任何更改后的任何评估都可能失败。
推荐阅读
- html - 如何在视图中水平显示记录
- sql - SQL - 文本函数不起作用(Reverse/Left/Substring/LTrim) - 很简单
- javascript - 如何使用 Espresso-web 断言元素属性值?
- python - numpy.linalg.inv() 的矩阵逆问题
- python - 使用 Python 从 MySQL 数据库中选择数据时使用“%s”附近错误的正确语法
- php - PHP 中带有对象数组的两个 ForEach 循环
- kotlin - 在 Kotlin 中向父类的方法中添加一些命令
- javascript - Javascript嵌套函数未定义
- django - 'put_object() 只接受关键字参数。'
- spring - Spring MVC 安装