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




