Apache POI:使用公式 FormulaEvaluator 读取单元格值时公式被删除

Apache POI : Formula gets removed while reading the cell value using formula FormulaEvaluator

我使用的是 3.17 版的 poi。在我的 java 代码中,我想读取一个具有公式的单元格值,我正在使用 FormulaEvaluatorevaluateInCell 函数来解析单元格值。

我的资源中有一个模板 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 获得了 evaluateFormulaCellevaluateInCell 非常有用,不仅用于计数 - 用它来干净地擦除公式。

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