关闭工作簿的文件处理程序 (apache poi)

2022-09-02 20:18:48

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

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

(我使用的是 POI 3.8)


答案 1

在传递给 的 InputStream 上维护一个句柄,并在完成工作簿后简单地关闭 InputStream,这似乎可以正常工作。例如:WorkbookFactory.create()

    InputStream is = // initialize
    try {
        Workbook wb = WorkbookFactory.create(is);
        // use the workbook
    } finally {
        if (is != null) is.close()
    }

答案 2

如果您需要完全控制资源何时关闭,则应预先创建 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(); }