关闭工作簿的文件句柄(apache poi)

时间:2012-09-04 09:58:14

标签: file-io apache-poi

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

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

(我正在使用POI 3.8)

5 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:10)

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

答案 2 :(得分:1)

如何在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");
}

答案 3 :(得分:0)

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

workBook.write(outputStream);

outputStream.close();

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

//Close the workBook
workBook.close();

//deleting the temporary files
workBook.dispose();

答案 4 :(得分: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库的开发人员不知道它是什么。


附言 事实上,这个问题是作为一个 bug 放在 bugzilla 中的,参见 https://bz.apache.org/bugzilla/show_bug.cgi?id=56537,并在 poi 3.11 或更高版本中得到解决和代码合并。所以有和我们一样问题的朋友可以看看,用完后关闭资源。