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

使用Java Selenium WebDriver+Apache POI读取Excel正常但无法写入问题

解决Java Selenium结合Apache POI写入Excel失败的问题

我来帮你排查下无法写入Excel的问题,看了你的代码,主要问题出在文件流的资源占用上,下面给你分析并提供修正后的方案:

问题分析

你的代码中打开了FileInputStream读取文件,但在写入FileOutputStream前没有关闭这个输入流,导致文件被输入流占用,输出流无法获取写入权限,最终导致写入失败。另外还有一些可以优化的细节点,比如空指针检查,避免后续出现意外报错。

修正后的代码

try { 
    // 指定要操作的Excel文件路径
    File src = new File("E:\\Dharshan\\test.xlsx"); 
    
    // 使用try-with-resources自动关闭输入流和Workbook,避免资源占用
    try (FileInputStream fis = new FileInputStream(src);
         XSSFWorkbook wb = new XSSFWorkbook(fis)) {
         
        // 获取要修改的工作表
        XSSFSheet sh1 = wb.getSheetAt(0); 
        
        // 读取并打印现有Excel内容
        System.out.println(sh1.getRow(0).getCell(0).getStringCellValue()); 
        System.out.println(sh1.getRow(0).getCell(1).getStringCellValue()); 
        System.out.println(sh1.getRow(1).getCell(0).getStringCellValue()); 
        System.out.println(sh1.getRow(1).getCell(1).getStringCellValue()); 
        System.out.println(sh1.getRow(2).getCell(0).getStringCellValue()); 
        System.out.println(sh1.getRow(2).getCell(1).getStringCellValue()); 
        
        // 写入数据,添加空指针检查避免行不存在的情况
        XSSFRow row0 = sh1.getRow(0);
        if (row0 != null) {
            row0.createCell(3).setCellValue("2.41.0");
        }
        
        XSSFRow row1 = sh1.getRow(1);
        if (row1 != null) {
            row1.createCell(3).setCellValue("2.5");
        }
        
        XSSFRow row2 = sh1.getRow(2);
        if (row2 != null) {
            row2.createCell(3).setCellValue("2.39");
        }
        
        // 使用try-with-resources自动关闭输出流,完成写入
        try (FileOutputStream fout = new FileOutputStream(src)) {
            wb.write(fout); 
        }
        System.out.println("数据写入成功!");
    }
} catch (Exception e) { 
    e.printStackTrace(); // 打印完整异常栈轨迹,更方便排查问题
}

修改说明

  • 自动关闭流:使用Java的try-with-resources语法,它会在代码块结束后自动关闭实现了AutoCloseable接口的资源(比如FileInputStream、XSSFWorkbook、FileOutputStream),彻底避免了输入流占用文件导致写入失败的核心问题。
  • 空指针检查:添加了对行对象的空判断,防止Excel中某行不存在时调用createCell()抛出NullPointerException,让代码更健壮。
  • 完整异常信息:把System.out.println(e.getMessage())改成e.printStackTrace(),这样能打印完整的异常栈轨迹,方便定位具体的错误原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:37:27