Apache POI无法正确计算Excel布尔函数问题求助
问题解决:Apache POI 布尔函数计算不更新值的问题
原因分析
你遇到的问题是因为evaluateFormulaCell方法仅完成公式评估,但在布尔类型结果的场景下,不会自动更新单元格的缓存值。直接调用getBooleanCellValue()读取的仍是修改前的旧缓存值,而非最新计算结果。
解决方案
使用FormulaEvaluator.evaluate()方法获取完整的计算结果对象,再将结果显式设置回单元格,确保单元格值被正确更新。
修正后的代码
public static void main(String[] args){ try{ FileInputStream file = new FileInputStream(new File("./eje.xlsm")); XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet sheet = workbook.getSheetAt(0); // 输出初始值 System.out.println(sheet.getRow(0).getCell(2).getBooleanCellValue()); // 修改B1单元格值为0 sheet.getRow(0).getCell(1).setCellValue(0); // 评估公式并更新单元格 FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); Cell formulaCell = sheet.getRow(0).getCell(2); CellValue cellValue = evaluator.evaluate(formulaCell); // 根据计算结果类型设置单元格值 switch(cellValue.getCellType()){ case BOOLEAN: formulaCell.setCellValue(cellValue.getBooleanValue()); break; case NUMERIC: formulaCell.setCellValue(cellValue.getNumberValue()); break; case STRING: formulaCell.setCellValue(cellValue.getStringValue()); break; case BLANK: formulaCell.setCellValue(""); break; case ERROR: formulaCell.setCellErrorValue(cellValue.getErrorValue()); break; default: formulaCell.setCellValue(cellValue.getStringValue()); } // 输出更新后的值 System.out.println(sheet.getRow(0).getCell(2).getBooleanCellValue()); // 保存文件并关闭资源 FileOutputStream out = new FileOutputStream("./eje.xlsm"); workbook.write(out); out.close(); workbook.close(); file.close(); } catch (Exception e) { System.out.println(e.getMessage()); } }
关键改动说明
- 用
evaluator.evaluate(formulaCell)获取包含类型和值的CellValue对象,替代仅完成评估的evaluateFormulaCell。 - 根据
CellValue的类型显式设置单元格值,覆盖旧缓存。 - 确保后续读取单元格值时获取的是最新计算结果。
内容的提问来源于stack exchange,提问作者SergioCo
相关产品推荐
相关产品推荐

