Я пытаюсь прочитать .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 года.