当前位置: 首页 > 知识库问答 >
问题:

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

苏翰学
2023-03-14

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

我不知道还能去哪里找;该应用程序不会导致csv和excel文件的这些问题,我只需调用转换器(xls =

(我用的是POI 3.8)

共有3个答案

易弘亮
2023-03-14
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");
}
易嘉胜
2023-03-14

如果您需要完全控制资源何时关闭,您应该在前面自己创建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(); }
苍兴怀
2023-03-14

在传递给< code > Workbook factory . create()的InputStream上维护一个句柄,并在使用完工作簿后简单地关闭InputStream,似乎就可以了。例如:

    InputStream is = // initialize
    try {
        Workbook wb = WorkbookFactory.create(is);
        // use the workbook
    } finally {
        if (is != null) is.close()
    }
 类似资料:
  • 函数名称:关闭文件句柄 函数功能:关闭文件句柄 函数方法 io.close() 函数用例 file,msg = io.open("/mnt/sdcard/kazhu.txt") if file then dialog("打开成功",5000) file:close() else dialog("打开失败,失败原因:"..msg,5000) end

  • 问题内容: 我正在使用JAI读取Java中的Tiff文件。使用此代码: 在使用Java 7的一个盒子上工作正常,但在使用Java 8的其他盒子上工作正常,请执行以下操作: 问题答案: 我的理论是,垃圾回收正在启动并完成一些本不该垃圾回收的工作。很奇怪。替换为: 问题似乎消失了。我的猜测是因为不会过早收集,因为它的句柄仍在局部变量范围内。可能还有其他JAI方法也可以做到这一点,只要确保在输入流上保留

  • 问题内容: 我想使用posix_spawn(…)(或非常相似的东西)生成一个进程集合。此函数接受posix_spawn_file_actions_t类型的参数,该参数允许我指定应如何对待打开的文件句柄。从文档中可以确定,所有文件都是从调用进程继承的,并根据posix_spawn_file_actions_t结构中的信息进行了修改。 我希望所有文件都不会被生成的进程打开(stdin,stdout和s

  • 我想在Sheet1之后将所有工作表从特定工作簿复制到当前工作簿 此代码正在复制所有工作表,包括隐藏的工作表。如何只复制可见的工作表?

  • 问题内容: 我希望能够使用Python读取Excel文件,在读取完成后保持Python脚本运行,并执行其他操作,同时能够在另一个进程中编辑Excel文件。我正在使用python 2.7和openpyxl。 当前看起来像: 运行函数后,即使我不想再使用Python读取Excel文件,它仍然被锁定以供其他进程访问(它给出错误“当前正在使用’‘文件名’。请稍后再试”。) 如何从脚本关闭文件?我尝试了OE

  • 问题内容: 我正在开发一个巨大的旧版Java应用程序,其中包含许多手写内容,如今您可以让一个框架来处理。 我现在面临的问题是,我们的Solaris Server上的文件句柄用尽了。我想知道跟踪打开文件句柄的最佳方法是什么?在哪里查看,什么会导致打开的文件句柄用尽? 我不能在Solaris下调试应用程序,只能在Windows开发环境上调试。分析Windows下的打开文件句柄是否甚至合理? 问题答案:

  • 对于来自Android应用程序的所有网络流量,我们都使用retrofit/okhttp3。到目前为止,一切似乎都进行得相当顺利。 然而,我们现在偶尔会出现应用程序/进程用完文件句柄的情况。 null null 如何防止OkHttp创建太多的文件句柄?

  • 这里的术语“工作簿”表示Microsoft Excel文件。 完成本章后,您将能够使用Java程序创建新的工作簿并打开现有的工作簿。 创建空白工作簿 以下简单程序用于创建空白Microsoft Excel工作簿。 import java.io.*; import org.apache.poi.xssf.usermodel.*; public class CreateWorkBook { pu