Подтвердить что ты не робот

Закрыть дескриптор файла для книги (apache poi)

Я построил новую книгу с помощью WorkbookFactory.create(new File("path/to/xlsx")). Однако, когда я пытаюсь редактировать файл в Excel после запуска приложения, я получаю сообщение об ошибке, что файл используется. Должен ли я освободить файл, и если да, то каким образом? (Я не мог найти ничего подобного Workbook.close() в api docs) Или мне нужно искать в других местах?

Я не знаю, где еще искать; приложение не вызывает эти проблемы с csv, а для файлов excel я просто вызываю конвертер (xls = > csv), который является единственной разницей.

(Я использую POI 3.8)

4b9b3361

Ответ 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();