Apache POI Runtimeexception при закрытии ()

1

У меня есть проблема с использованием Apache POI для чтения некоторого содержимого.docx и отображения результата как неформатированного предварительного просмотра. Im с использованием POI версии 3.11.

Код:

private static String POI2Text(File file) {
    POITextExtractor extractor = null;
    try {
        extractor = ExtractorFactory.createExtractor(file);
        return extractor.getText();
    } catch (Exception ex) {
        logger.warn("Error:", ex);
    } finally {
        if (extractor!=null) try { extractor.close(); } catch (Exception ex) { logger.warn("Error:", ex); }
    }
    return "";
}

Следующее исключение выбрано в блоке finally (extractor.close()):

org.apache.poi.openxml4j.exceptions.OpenXML4JRuntimeException: Fail to save: an error occurs while > saving the package : part
     at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:503) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1425) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.OPCPackage.save(OPCPackage.java:1412) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.ZipPackage.closeImpl(ZipPackage.java:353) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.OPCPackage.close(OPCPackage.java:425) ~[agent.jar:na]
     at org.apache.poi.POIXMLTextExtractor.close(POIXMLTextExtractor.java:87) ~[agent.jar:na]
     ....
Caused by: java.lang.IllegalArgumentException: part
     at org.apache.poi.openxml4j.opc.OPCPackage.addPackagePart(OPCPackage.java:873) ~[agent.jar:na]
     at org.apache.poi.openxml4j.opc.ZipPackage.saveImpl(ZipPackage.java:448) ~[agent.jar:na]
     ... 15 common frames omitted

Любые идеи, как предотвратить это исключение? Самая большая проблема заключается в том, что poi не освобождает дескриптор файла после исключения исключения. Мне нужно иметь возможность перемещать или редактировать файл за пределами моего приложения.

  • 0
    Это на всех файлах, или просто несколько?
  • 0
    И можете ли вы попробовать недавнюю ночную сборку? (Новее, чем 3.11 финал)
Показать ещё 2 комментария
Теги:
exception
apache-poi
docx

1 ответ

0

Просто быстрая обратная связь: я мог решить проблему, открыв входной поток как доступный только для чтения, а затем используя этот поток для извлечения данных с помощью POITextExtractor.

try (InputStream is = Files.newInputStream(path, StandardOpenOption.READ);
            POITextExtractor extractor = ExtractorFactory.createExtractor(is)) {
    return extractor.getText();
} catch (Exception ex) {
    logger.warn("Error in file {}", path, ex);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню