使用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
相关产品推荐
相关产品推荐

