You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Apache POI无法在运行时更新公式的解决方案求助

解决Apache POI运行时Excel公式不自动更新的问题

我来帮你搞定这个公式实时计算的问题——之前我也踩过类似的坑,Apache POI的公式计算逻辑和Excel客户端不太一样,你之前用的两种方法没生效是因为没踩对关键点:

问题根源

  • workbook.setForceFormulaRecalculation(true) 这个配置是给Excel客户端用的,它只会让Excel在打开文件时自动重新计算公式,而不是让POI在运行时直接算出结果。
  • 你调用FormulaEvaluator的方式没把计算结果同步回单元格,所以直接getNumericCellValue拿到的还是旧的缓存值。

正确的解决方案

你需要用FormulaEvaluator主动计算目标单元格,并且把计算结果更新到单元格里,或者直接获取返回的计算值。下面是两种可行的修改方式:

方式1:单独计算指定公式单元格

FileInputStream excelFile = new FileInputStream(new File(FILE_NAME));
Workbook workbook = new XSSFWorkbook(excelFile);
Sheet datatypeSheet = workbook.getSheetAt(1);

// 设置依赖单元格的值
datatypeSheet.getRow(19).getCell(2).setCellValue(0);

// 获取公式计算器
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
Cell formulaCell = datatypeSheet.getRow(19).getCell(8);

// 计算公式并获取结果
CellValue cellValue = evaluator.evaluate(formulaCell);
// 把计算结果设置回单元格(可选,确保保存到文件后也能看到最新值)
evaluator.evaluateFormulaCell(formulaCell);

// 直接打印最新计算结果
System.out.println(cellValue.getNumberValue());

// 保存并关闭资源
FileOutputStream out = new FileOutputStream(new File(FILE_NAME));
workbook.write(out);
out.close();
workbook.close();
excelFile.close();

方式2:批量计算整个工作表的公式

如果你的工作表里有多个公式需要更新,可以一次性遍历计算所有公式单元格:

// ...前面的初始化代码和设置单元格值的部分不变...

FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();
// 遍历工作表所有单元格,计算公式
for (Row row : datatypeSheet) {
    for (Cell cell : row) {
        if (cell.getCellType() == CellType.FORMULA) {
            evaluator.evaluateFormulaCell(cell);
        }
    }
}

// 现在获取的就是最新计算值
System.out.println(datatypeSheet.getRow(19).getCell(8).getNumericCellValue());

// ...保存并关闭资源的代码不变...

关键注意点

  • 必须先修改依赖单元格的值,再调用FormulaEvaluator的计算方法,顺序不能反。
  • evaluateFormulaCell会自动把计算结果缓存到单元格中,后续调用getNumericCellValue就能拿到最新值;evaluate方法会直接返回计算结果,可直接使用。

内容的提问来源于stack exchange,提问作者user1386985

火山引擎 最新活动