18

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

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

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

4

6 に答える 6

18

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

    InputStream is = // initialize
    try {
        Workbook wb = WorkbookFactory.create(is);
        // use the workbook
    } finally {
        if (is != null) is.close()
    }
于 2012-11-02T17:04:16.283 に答える
13

リソースがいつ閉じられるかを完全に制御する必要がある場合は、事前に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(); }
于 2012-09-04T12:36:16.120 に答える
2

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");
}
于 2014-11-22T18:52:06.667 に答える
2

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

workBook.write(outputStream);

outputStream.close();

その後、ワークブックを閉じて (それ以上の操作を行わないように)、一時ファイルを破棄する必要があります。

//Close the workBook
workBook.close();

//deleting the temporary files
workBook.dispose();
于 2018-01-09T14:17:29.507 に答える