我是该网站的新用户。我尝试在 Excel 文件打开时对其进行写入(使用 POI / JAVA)。
当我尝试创建文件输出流以写入文件时,出现
java.io.FileNotFoundException
错误。
FileOutputStream
不起作用。我收到以下消息:
该进程无法访问该文件,因为该文件正在被另一个进程使用 过程。
try {
FileOutputStream fileOut;
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("Classeur.xlsm"));
...
...
fileOut = new FileOutputStream("Classeur.xlsm");
wb.write(fileOut);
fileOut.close();
}
catch (FileNotFoundException e){
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
有人知道我该如何解决吗?我正在编写一个(POI-Java-Swing)应用程序来动态读取/写入 Excel 文件。
感谢您的帮助
Windows 本身不会让你这样做。恐怕您的代码中没有任何内容可以让您这样做。您需要先关闭 Excel 中的文件。
编辑 - 根据您的描述,我假设您已在 Excel 中自行打开该文件。你可能不是。然而,其他东西肯定会这样做——例如,它可能是您的 Java 应用程序的另一个实例。甚至确保 Windows 资源管理器之类的东西不会访问/使用该文件,例如检查属性。在您排除这一点之前,正如前面提到的,Windows 本身会阻止您访问它。
有另一个进程正在某处运行,正在访问您尝试写入的exact Excel 文件。查看是否有正在运行的 Excel 应用程序(如 Microsoft Excel)锁定您的文件,或者是否有 Java 进程已锁定同一文件。
如果文件已打开,您将获得
java.io.FileNotFoundException
。这就是为什么在写入文件之前你必须检查它。
示例:
File file = new File("workbook.xls");
if(file.canWrite()) {
System.out.println("File is open or permission issue");
} else {
FileOutputStream fileOut = new FileOutputStream(file);
wb.write(fileOut);
fileOut.close();
}
我无法删除 java 中的文件主题中讨论了类似的问题。也许它可以帮助您找到解决问题的正确方法。
我不知道这是否有效,但我想你应该尝试一下。
当我做与你类似的事情时,我了解到Excel公式可以引用另一个Excel文件的单元格,例如
='D:\excelfiles\[Book1.xlsx]Sheet1'!$A$1
那么,为什么不更新另一个文件,例如 Book1.xlsx(该文件已关闭,这样您就不会出现异常),并让您打开的文件引用 Book1.xlsx 中单元格的位置
嗯,我期待这里有很多反对票,但我认为值得一试:)