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

使用Apache POI在Java中更新Excel文件时二次获取单元格返回null问题

解决Excel第二次获取单元格返回null的问题

我来帮你排查这个问题!从你给出的代码片段来看,第二次获取单元格返回null大概率是因为POI不会自动创建不存在的单元格/行,再加上代码里还有几个容易踩坑的点,咱们一步步来解决:

1. 核心问题:writeToCell方法未处理空行/空单元格

Apache POI的规则是:如果目标行或单元格不存在,getRow()和getCell()会直接返回null,不会自动创建。如果你的writeToCell方法没做判断就直接操作,自然会出现null的情况。

给你一个健壮的writeToCell实现:

private void writeToCell(int rowNum, int colNum, String value) {
    // 先获取行,不存在则创建
    XSSFRow row = sheet.getRow(rowNum);
    if (row == null) {
        row = sheet.createRow(rowNum);
    }
    // 再获取单元格,不存在则创建
    XSSFCell cell = row.getCell(colNum);
    if (cell == null) {
        cell = row.createCell(colNum);
    }
    // 赋值单元格内容
    cell.setCellValue(value);
}

2. 修复资源泄漏与未保存的问题

你的代码里还有两个致命问题:

  • 打开的FileInputStream没有关闭,会造成资源占用
  • 修改后的Workbook没有写回文件,所有操作等于白做

用try-with-resources语法自动管理资源,同时添加写入逻辑:

public class ExcelWriter { 
    XSSFSheet sheet; 

    public ExcelWriter(List<String> nurses, List<String> therapist) { 
        // try-with-resources会自动关闭流和Workbook
        try (FileInputStream file = new FileInputStream("Schedule.xlsx");
             XSSFWorkbook workbook = new XSSFWorkbook(file)) { 
             
            sheet = workbook.getSheetAt(0); 
            // 额外判断:如果第一个sheet不存在,就创建一个新的
            if (sheet == null) {
                sheet = workbook.createSheet();
            }

            // 写入护士数据到第0列,行从1开始
            for (int i=0;i<nurses.size();i++) { 
                writeToCell(i+1, 0, nurses.get(i)); 
            } 
            // 写入治疗师数据到第1列,行从1开始(根据你的需求调整列号)
            for (int i=0;i<therapist.size();i++) { 
                writeToCell(i+1, 1, therapist.get(i)); 
            }

            // 关键!把修改后的Workbook写回文件
            try (FileOutputStream outputStream = new FileOutputStream("Schedule.xlsx")) {
                workbook.write(outputStream);
            }
        } catch (IOException e) {
            e.printStackTrace();
            // 这里可以添加自定义的异常处理,比如提示用户文件操作失败
        } 
    } 

    // 把上面的writeToCell方法放在这里
    private void writeToCell(int rowNum, int colNum, String value) {
        XSSFRow row = sheet.getRow(rowNum);
        if (row == null) {
            row = sheet.createRow(rowNum);
        }
        XSSFCell cell = row.getCell(colNum);
        if (cell == null) {
            cell = row.createCell(colNum);
        }
        cell.setCellValue(value);
    }
}

3. 额外注意事项

  • 确保Schedule.xlsx的路径是正确的,如果是相对路径,要确认程序运行的工作目录下存在这个文件
  • 如果你的Excel是.xls格式(旧版本),需要替换XSSFWorkbook为HSSFWorkbook,XSSFSheet为HSSFSheet,以此类推

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:36:43