首页 > 解决方案 > 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;
        }
    }

为什么图书馆这样做,并从单元格中删除实际公式。

标签: excelapache-poixssfpoi-hssf

解决方案


有不同的功能:

 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.

显然,你已经采取evaluateInCellevaluateFormulaCellevaluateInCell非常有用,不仅用于计数 - 用于干净擦除公式。

另外,不要忘记clearAllCachedResultValues()notifyUpdateCell()/ notifySetFormula()。没有这些,对工作表进行任何更改后的任何评估都可能失败。


推荐阅读