3

我是网站上的新手。我尝试在打开 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 文件。

谢谢你的帮助

4

5 回答 5

4

Windows 本身不会让您这样做。恐怕您的代码中没有任何内容可以让您这样做。您需要先在 Excel 中关闭该文件。

编辑 - 我从您的描述中假设您已经在 Excel 中自己打开了文件。你可能不是。然而,其他东西肯定会发生 - 例如,它可能是您的 Java 应用程序的另一个实例。甚至确保诸如 Windows Explorer 之类的东西没有访问/使用该文件,例如检查属性。直到您排除这一点,如前所述,Windows 本身会阻止您访问它。

于 2012-10-17T16:09:13.817 回答
3

某个地方正在运行另一个进程,它正在访问您尝试写入的确切Excel 文件。查看是否没有正在运行的 Excel 应用程序(如 Microsoft Excel)锁定了您的文件,或者是否有 Java 进程已经锁定了同一文件。

于 2012-10-17T16:09:36.140 回答
1

如果文件已打开,您将获得java.io.FileNotFoundException. 这就是为什么在写文件之前你必须检查它。

例子 :

File file = new File("workbook.xls");
if(file.canWrite()) {
    System.out.println("File is open");
} else {
    FileOutputStream fileOut = new FileOutputStream(file);
    wb.write(fileOut);
    fileOut.close();
}
于 2012-10-17T16:12:39.023 回答
0

I can't delete a file in java topic中讨论的类似问题。也许它可以帮助您找到解决问题的正确方法。

于 2012-10-17T16:09:27.560 回答
0

好吧,我不知道这是否可行,但我想你应该试一试。

当我做和你做类似的事情时,我了解到 excel 公式可以引用另一个 excel 文件的单元格,例如

='D:\excelfiles\[Book1.xlsx]Sheet1'!$A$1

那么为什么不更新另一个文件,例如 Book1.xlsx(它已关闭,因此您不会得到异常),并让您打开的文件引用 Book1.xlsx 中单元格的位置

好吧,我在这里期待很多反对票,但我认为值得一试:)

于 2012-10-19T18:49:17.987 回答