使用Apache POI写入Excel重复执行遇FileNotFoundException求助
问题分析与解决方案
这个报错的核心原因很明确:第一次执行脚本后,Excel文件相关的IO资源(比如文件流、工作簿对象)没有被完全释放,导致操作系统锁定了文件,第二次执行时无法再次打开写入。另外也有可能是第一次运行后,你手动打开了生成的Excel文件却没关闭,导致脚本无法访问文件。
下面给你几个针对性的解决办法:
1. 用try-with-resources自动管理资源(推荐)
Java 7及以上支持的try-with-resources语法会自动关闭实现了AutoCloseable接口的资源,不用手动写finally块,能彻底避免资源泄漏。比如用Apache POI操作xls的代码可以写成这样:
// 写入或追加数据的逻辑 try (FileOutputStream fos = new FileOutputStream("TestResultData2.xls"); HSSFWorkbook workbook = new HSSFWorkbook()) { // 这里写你的数据写入逻辑,比如找到空行、填充数组 // ... // 最后把工作簿写入流 workbook.write(fos); } catch (IOException e) { e.printStackTrace(); }
如果是要追加数据到已有文件,需要先读取现有工作簿,代码如下:
try (FileInputStream fis = new FileInputStream("TestResultData2.xls"); HSSFWorkbook workbook = new HSSFWorkbook(fis); FileOutputStream fos = new FileOutputStream("TestResultData2.xls")) { // 找到最后一行空行的逻辑 Sheet sheet = workbook.getSheetAt(0); int lastRowNum = sheet.getLastRowNum(); Row newRow = sheet.createRow(lastRowNum + 1); // 填充你的数据数组到newRow // ... workbook.write(fos); } catch (IOException e) { e.printStackTrace(); }
2. 手动在finally块关闭所有资源(兼容旧Java版本)
如果你的项目用的是Java 6及以下,必须手动在finally块中关闭流和工作簿,注意要分别捕获关闭时的异常,避免一个资源关闭失败导致其他资源无法关闭:
FileOutputStream fos = null; HSSFWorkbook workbook = null; try { workbook = new HSSFWorkbook(); // 数据写入逻辑 // ... fos = new FileOutputStream("TestResultData2.xls"); workbook.write(fos); } catch (IOException e) { e.printStackTrace(); } finally { // 先关闭文件流 if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } // 再关闭工作簿 if (workbook != null) { try { workbook.close(); } catch (IOException e) { e.printStackTrace(); } } }
3. 排除外部进程占用
每次执行脚本前,确保TestResultData2.xls没有被其他程序打开(比如你的电脑上手动打开了这个Excel文件没关),这种情况下操作系统会锁定文件,脚本肯定无法写入。
按照上面的方法调整代码后,应该就能解决第二次执行报错的问题了。
内容的提问来源于stack exchange,提问作者bc14
相关产品推荐
相关产品推荐

