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

新手上路,请多包涵

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

我不知道还有什么地方可以看;该应用程序不会导致 csv 出现这些问题,对于 excel 文件,我只是调用转换器 (xls => csv),这是唯一的区别。

(我正在使用 POI 3.8)

原文由 ted 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 961
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(); }

原文由 Gagravarr 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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

原文由 Mark T. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题