Исключение при чтении рабочей книги XLSM через Apache POI - PullRequest
1 голос
/ 14 февраля 2012

Я пытаюсь прочитать .xlsm файл, используя библиотеку Apache POI (3.8-beta5):

Workbook wb = null;
try {
    wb =  WorkbookFactory.create(isXLSFile);
} catch (IOException e) {
...

ничего сложного. Хотя обычно документы читаются хорошо, один документ создает исключение:

Caused by: java.lang.IllegalStateException: A sheet hyperlink must either have a location, or a relationship. Found:
<xml-fragment ref="H13" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac"/>
    at org.apache.poi.xssf.usermodel.XSSFHyperlink.<init>(XSSFHyperlink.java:72)
    at org.apache.poi.xssf.usermodel.XSSFSheet.initHyperlinks(XSSFSheet.java:250)
    at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:203)
    at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:175)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:260)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:159)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:174)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:67)

Интересно, что если я открою файл в LibreOffice (без MS Office на моем компьютере) и повторно сохраню его (сохраняя формат), то документ будет прочитан нормально. Как я понимаю, эта проблема как-то связана с достоверностью структуры документа - так что это проблема с данными, а не ошибка в коде библиотеки (или нет?). Но, может быть, есть способ подавить такие ошибки?

[ОБНОВЛЕНИЕ] Исправление, упомянутое в комментариях к принятому ответу, было интегрировано в 3.8 версию Apache POI, выпущенную 26 марта 2012 года.

1 Ответ

1 голос
/ 20 февраля 2012

Я только что получил такой файл от пользователя в отчете об ошибках Google Refine.Я пришел к выводу, что это ошибка Apache POI, и они слишком строги, жалуясь на ссылку, которая не используется.Кроме того, выбрасывать RuntimeException вместо объявленного (проверенного) исключения является своего рода грубостью.Я подал отчет об ошибке: https://issues.apache.org/bugzilla/show_bug.cgi?id=52716

...