web-dev-qa-db-ja.com

ワークブックのファイルハンドルを閉じる(Apache poi)

WorkbookFactory.create(new File("path/to/xlsx"))を使用して新しいワークブックを作成しました。しかし、アプリケーションの起動後にExcelでファイルを編集しようとすると、ファイルが使用中であるというエラーメッセージが表示されます。ファイルを解放する必要がありますか。解放する場合はどうすればよいですか。 (APIドキュメントでWorkbook.close()のようなものを見つけることができませんでした)または、他の場所を調べる必要がありますか?

他にどこを見ればいいのかわかりません。アプリケーションはcsvでこれらの問題を引き起こさず、Excelファイルの場合、唯一の違いであるコンバーター(xls => csv)を呼び出します。

(POI 3.8を使用しています)

15
ted

リソースが閉じられるタイミングを完全に制御する必要がある場合は、OPCPackageを事前に作成し、それをWorkbookFactoryに渡す必要があります。 OPCPackageは、あなたが望んでいるcloseメソッドを提供します。ワークブックはガベージコレクションまで開いたままになります

コードは次のようになります。

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

WorkbookFactory.create()に渡されたInputStreamのハンドルを維持し、Workbookでの作業が終了したらInputStreamを閉じるだけで問題なく動作するようです。例えば:

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

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");
}
1
Eric Leschinski

最初に、workBookに書き込まれるストリームを閉じる必要があります。

workBook.write(outputStream);

outputStream.close();

その後、uは(以降の操作のために)workBookを閉じ、一時ファイルを破棄します。

//Close the workBook
workBook.close();

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