Search code examples
javafile-ioapache-poi

Close Filehandle for Workbook (apache poi)


I constructed a new Workbook using WorkbookFactory.create(new File("path/to/xlsx")). However, when I try to edit the File in Excel after starting the application, I get an error message that the file is in use. Do I have to free the file up, and if so, how? (I could not find anything like Workbook.close() in the api docs) Or do I have to look in other places?

I have no clue where else to look; the application does not cause these issues with csv and for excel files I simply call the converter (xls => csv) which is the only difference.

(I am using POI 3.8)


Solution

  • If you need full control of when the resources get closed, you should create the OPCPackage yourself up front, and pass that into WorkbookFactory. OPCPackage provides the close method you're after. A Workbook will remain open until garbage collection.

    Your code would look something like:

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