Закрыть дескриптор файла для книги (apache poi)
Я построил новую книгу с помощью WorkbookFactory.create(new File("path/to/xlsx"))
. Однако, когда я пытаюсь редактировать файл в Excel после запуска приложения, я получаю сообщение об ошибке, что файл используется. Должен ли я освободить файл, и если да, то каким образом? (Я не мог найти ничего подобного Workbook.close()
в api docs) Или мне нужно искать в других местах?
Я не знаю, где еще искать; приложение не вызывает эти проблемы с csv, а для файлов excel я просто вызываю конвертер (xls = > csv), который является единственной разницей.
(Я использую POI 3.8)
Ответы
Ответ 1
Если вам нужен полный контроль над закрытием ресурсов, вы должны сами создать 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(); }
Ответ 2
Кажется, что все в порядке, чтобы поддерживать дескриптор InputStream, переданный в WorkbookFactory.create()
, и просто закрыть InputStream, когда закончите с Workbook. Например:
InputStream is = // initialize
try {
Workbook wb = WorkbookFactory.create(is);
// use the workbook
} finally {
if (is != null) is.close()
}
Ответ 3
Как закрыть экземпляр рабочей книги POI в Java:
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");
}
Ответ 4
Сначала вам нужно закрыть поток, который написан на рабочем столе:
workBook.write(outputStream);
outputStream.close();
После этого u должен закрыть workBook (без дальнейших операций) и удалить временные файлы:
//Close the workBook
workBook.close();
//deleting the temporary files
workBook.dispose();