You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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());
    }
}

关键改动说明

  1. 用evaluator.evaluate(formulaCell)获取包含类型和值的CellValue对象,替代仅完成评估的evaluateFormulaCell。
  2. 根据CellValue的类型显式设置单元格值,覆盖旧缓存。
  3. 确保后续读取单元格值时获取的是最新计算结果。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:18:18