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

ted*_*ted 15 file-io apache-poi

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

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

(我正在使用POI 3.8)

Mar*_* T. 17

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

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

  • 好一个.如果您知道将执行只读操作,则还可以在创建工作簿后立即关闭InputStream,然后将其放在内存中.我个人觉得它更明确. (4认同)
  • 关闭 wb 怎么样? (2认同)

Gag*_*arr 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(); }
Run Code Online (Sandbox Code Playgroud)