如何用Java POI操作Excel另一工作表?空指针异常问题求助
解决POI操作Excel Sheet2时的NullPointerException问题
你的空指针异常问题很典型——当你试图操作Excel里不存在的行或单元格时,Apache POI不会自动帮你创建它们,getRow()或getCell()会直接返回null,后续再调用方法自然就抛出NullPointerException了。比如你代码里的sheet2.getRow(3),如果Sheet2中第4行(POI的行索引从0开始计数)根本不存在,这个方法就会返回null,接着调用.getCell(2)肯定就炸了。
修复步骤
要解决这个问题,我们需要先检查行和单元格是否存在,不存在就主动创建:
- 先判断目标行是否存在,不存在则用
createRow()创建 - 再判断目标单元格是否存在,不存在则用
createCell()创建 - 另外推荐使用try-with-resources语法,它会自动关闭流,避免资源泄漏
修改后的完整代码
public static void main(String[] args) { // 使用try-with-resources自动关闭流,无需手动close try (FileInputStream files = new FileInputStream(new File("d:\\Materi\\Selenium\\Projects\\Excel\\Book1.xlsx")); XSSFWorkbook workbook = new XSSFWorkbook(files); FileOutputStream fout = new FileOutputStream(new File("d:\\Materi\\Selenium\\Projects\\Excel\\Book1.xlsx"))) { // 获取Sheet1(如果不需要操作可注释) XSSFSheet sheet1 = workbook.getSheet("Sheet1"); // 获取Sheet2,不存在则创建 XSSFSheet sheet2 = workbook.getSheet("Sheet2"); if (sheet2 == null) { sheet2 = workbook.createSheet("Sheet2"); } // 检查并创建第4行(索引3) XSSFRow row = sheet2.getRow(3); if (row == null) { row = sheet2.createRow(3); } // 检查并创建第3列(索引2)的单元格 XSSFCell cell = row.getCell(2); if (cell == null) { cell = row.createCell(2); } // 设置单元格值 cell.setCellValue("Test"); // 写入工作簿 workbook.write(fout); } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); } catch (IOException ioe) { ioe.printStackTrace(); } }
额外提示
- POI的行和单元格索引都是从0开始的,所以
getRow(3)对应Excel里的第4行,getCell(2)对应第3列 - 如果你的Sheet2本身都不存在,
workbook.getSheet("Sheet2")会返回null,上述代码里已经加上了创建Sheet的判断,避免这种情况的空指针
内容的提问来源于stack exchange,提问作者Rifki Nurgraha
相关产品推荐
相关产品推荐

