WorkbookFactory.create(new File("path/to/xlsx"))
を使用して新しいワークブックを作成しました。しかし、アプリケーションの起動後にExcelでファイルを編集しようとすると、ファイルが使用中であるというエラーメッセージが表示されます。ファイルを解放する必要がありますか。解放する場合はどうすればよいですか。 (APIドキュメントでWorkbook.close()
のようなものを見つけることができませんでした)または、他の場所を調べる必要がありますか?
他にどこを見ればいいのかわかりません。アプリケーションはcsvでこれらの問題を引き起こさず、Excelファイルの場合、唯一の違いであるコンバーター(xls => csv)を呼び出します。
(POI 3.8を使用しています)
リソースが閉じられるタイミングを完全に制御する必要がある場合は、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(); }
WorkbookFactory.create()
に渡されたInputStreamのハンドルを維持し、Workbookでの作業が終了したらInputStreamを閉じるだけで問題なく動作するようです。例えば:
InputStream is = // initialize
try {
Workbook wb = WorkbookFactory.create(is);
// use the workbook
} finally {
if (is != null) is.close()
}
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");
}
最初に、workBookに書き込まれるストリームを閉じる必要があります。
workBook.write(outputStream);
outputStream.close();
その後、uは(以降の操作のために)workBookを閉じ、一時ファイルを破棄します。
//Close the workBook
workBook.close();
//deleting the temporary files
workBook.dispose();