18

我使用WorkbookFactory.create(new File("path/to/xlsx")). 但是,当我在启动应用程序后尝试在 Excel 中编辑文件时,我收到一条错误消息,指出该文件正在使用中。我是否必须释放文件,如果是,如何释放?(我在 api 文档中找不到类似的东西Workbook.close())还是我必须在其他地方寻找?

我不知道还能去哪里看;该应用程序不会导致 csv 和 excel 文件出现这些问题,我只需调用转换器 (xls => csv),这是唯一的区别。

(我正在使用 POI 3.8)

4

6 回答 6

18

维护传递给的 InputStream 的句柄似乎工作得很好WorkbookFactory.create(),并在完成工作簿后简单地关闭 InputStream。例如:

    InputStream is = // initialize
    try {
        Workbook wb = WorkbookFactory.create(is);
        // use the workbook
    } finally {
        if (is != null) is.close()
    }
于 2012-11-02T17:04:16.283 回答
13

如果您需要完全控制资源何时关闭,您应该预先自己创建 OPCPackage,并将其传递给 WorkbookFactory。OPCPackage 提供了您所追求的关闭方法。工作簿将保持打开状态,直到垃圾收集

您的代码将类似于:

     File f = new File("/path/to/excel/file");
     Workbook wb = null;

     NPOIFSFileSystem npoifs = null;
     OPCPackage pkg = null;
     try {
       npoifs = new NPOIFSFileSystem(f);
       wb = WorkbookFactory.create(npoifs);
     } catch(OfficeXmlFileException ofe) {
       pkg = OPCPackage.open(f);
       wb = WorkbookFactory.create(pkg);
     }

     // Use it

     if (npoifs != null) { npoifs.close(); }
     if (pkg != null) { pkg.close(); }
于 2012-09-04T12:36:16.120 回答
2

如何在 Java 中关闭 POI 工作簿的实例:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;


try{
    File workbookFile = new File("C:\\repo\\yourfile.xslx");
    FileInputStream file = new FileInputStream(workbookFile);
    Workbook wb = WorkbookFactory.create(file);
    Sheet sheet = wb.getSheetAt(0);

    //use the instance of wb.

    file.close();

}
catch(Exception e){
    System.out.println("Fail");
}
于 2014-11-22T18:52:06.667 回答
2

首先,您需要关闭写入工作簿的流:

workBook.write(outputStream);

outputStream.close();

之后你应该关闭工作簿(不再进行操作)并处理临时文件:

//Close the workBook
workBook.close();

//deleting the temporary files
workBook.dispose();
于 2018-01-09T14:17:29.507 回答
1

我正在使用 poi api 5.0.0 版。此版本中的 Workbook 有一个 close() 方法,根据 API 文档所述:

“关闭从中读取工作簿的基础输入资源(文件或流)。”

//使用try-catch-finally:

Workbook workbook = null;
try {
    workbook = WorkbookFactory.create(inputStream);
    //....
} catch (IOException ex) {
    //...
}finally {
    workbook.close();
}

//使用try-with-resources:

try(Workbook workbook = WorkbookFactory.create(fileStream)) {
    //....
} catch (IOException ex) {
    //...
}
于 2021-10-15T22:43:14.240 回答
0

截至 2021 年,只是遇到了同样的问题。:(,当使用 poi 3.9 版时。

我只是发现如果我们将poi版本升级到3.17(如果你还在使用Java 7,那么poi 4或更高版本只支持Java 8或更高版本),

然后工作簿将实施AutoCloseable

因此可以使用Try-With-Resources块来自动关闭文件。

这是演示代码。

try (Workbook workbook = WorkbookFactory.create(new File(fileLocation))) {
   // operate on the workbook here...
}

我认为上面的代码比@Gagravarr 解决方案更好,因为它复制了 create 方法在外面做的事情,不熟悉 poi 库的开发人员不知道它是什么。


PS 事实上,这个问题作为一个 bug 放在了 bugzilla 中,请参阅https://bz.apache.org/bugzilla/show_bug.cgi?id=56537,并已解决并将代码合并到 poi 3.11 或更高版本中。因此,任何与我们有相同问题的人都可以查看它,并在完成使用后关闭资源。

于 2021-05-25T06:39:50.947 回答