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

使用Apache POI写入XLSX文件失败:追加数据时出现空指针异常

解决XLSX文件追加数据时的空指针异常问题

嘿,我看到你在用Apache POI给XLSX文件追加数据时碰到了空指针异常,而且试了现有方案都没解决,这确实挺闹心的。咱们先从你给出的代码片段和这类问题的常见坑点入手,一步步排查解决~

常见触发空指针的原因&对应解决方案


1. 工作簿初始化逻辑错误

很多人追加数据时直接新建XSSFWorkbook(),而不是从现有文件流读取,这会导致后续操作找不到原有sheet/行,直接空指针。正确的打开方式是:

File file = new File("你的文件路径.xlsx");
XSSFWorkbook workbook;
if (file.exists()) {
    FileInputStream fis = new FileInputStream(file);
    workbook = new XSSFWorkbook(fis);
    fis.close(); // 记得关流
} else {
    workbook = new XSSFWorkbook(); // 文件不存在就新建工作簿
}

同时一定要先判断文件是否存在,避免因路径错误或文件缺失导致的流读取异常。

2. Sheet/Row未做非空校验

当你要追加到指定sheet时,得先确认sheet是否存在;获取行的时候,也别直接用getRow()(空行可能导致返回null),推荐直接创建新行:

XSSFSheet sheet = workbook.getSheet("Sheet1");
// 如果目标sheet不存在,直接新建
if (sheet == null) {
    sheet = workbook.createSheet("Sheet1");
}
// 获取最后一行行号,直接创建下一行(不用getRow避免null)
int lastRowNum = sheet.getLastRowNum();
XSSFRow newRow = sheet.createRow(lastRowNum + 1);

这里要注意:如果表格完全是空的,getLastRowNum会返回-1,lastRowNum + 1就是0,刚好是第一行,不会有问题。

3. 单元格操作未处理null情况

如果直接用newRow.getCell(0)获取单元格,当单元格不存在时会返回null,直接赋值就会触发空指针。正确做法是用createCell确保单元格存在:

// 直接创建单元格,无需提前判断
XSSFCell cell = newRow.createCell(0);
cell.setCellValue("要追加的内容");

4. 资源未正确释放

文件写入后如果没关闭工作簿或输出流,可能会导致文件损坏,后续读取时触发异常。推荐用try-with-resources语法自动关流:

try (FileOutputStream fos = new FileOutputStream(file)) {
    workbook.write(fos);
} catch (IOException e) {
    e.printStackTrace();
} finally {
    if (workbook != null) {
        workbook.close();
    }
}

完整可运行的追加数据示例代码


package test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class Test1 {
    public static void appendToXlsx(String filePath, String sheetName, String[] data) {
        XSSFWorkbook workbook = null;
        File file = new File(filePath);
        
        try {
            // 读取现有文件或新建工作簿
            if (file.exists()) {
                FileInputStream fis = new FileInputStream(file);
                workbook = new XSSFWorkbook(fis);
                fis.close();
            } else {
                workbook = new XSSFWorkbook();
            }
            
            // 获取或创建目标sheet
            XSSFSheet sheet = workbook.getSheet(sheetName);
            if (sheet == null) {
                sheet = workbook.createSheet(sheetName);
            }
            
            // 创建新行并写入数据
            int lastRowNum = sheet.getLastRowNum();
            XSSFRow newRow = sheet.createRow(lastRowNum + 1);
            
            for (int i = 0; i < data.length; i++) {
                XSSFCell cell = newRow.createCell(i);
                cell.setCellValue(data[i]);
            }
            
            // 写入文件并自动关流
            try (FileOutputStream fos = new FileOutputStream(file)) {
                workbook.write(fos);
            }
            
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 确保工作簿关闭
            try {
                if (workbook != null) {
                    workbook.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    public static void main(String[] args) {
        // 测试追加数据
        appendToXlsx("test.xlsx", "Sheet1", new String[]{"张三", "25", "后端工程师"});
    }
}

你可以把这段代码替换你现有的逻辑,或者对照着检查你代码里的疏漏点,应该能解决空指针的问题~

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

火山引擎 最新活动