diff --git a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java index 8d50bc62c..2accb0265 100644 --- a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java +++ b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java @@ -47,6 +47,7 @@ import org.apache.poi.xssf.usermodel.XSSFShape; import org.apache.xmlbeans.XmlException; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet; import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook; +import org.openxmlformats.schemas.spreadsheetml.x2006.main.STSheetState; import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument; /** @@ -226,7 +227,16 @@ public class XSSFReader { //step 2. Read array of CTSheet elements, wrap it in a ArayList and construct an iterator //Note, using XMLBeans might be expensive, consider refactoring to use SAX or a plain regexp search CTWorkbook wbBean = WorkbookDocument.Factory.parse(wb.getInputStream(), DEFAULT_XML_OPTIONS).getWorkbook(); - sheetIterator = wbBean.getSheets().getSheetList().iterator(); + List validSheets = new ArrayList(); + for (CTSheet ctSheet : wbBean.getSheets().getSheetList()) { + //if there's no relationship id, silently skip the sheet + if ("".equals(ctSheet.getId())) { + //skip it + } else { + validSheets.add(ctSheet); + } + } + sheetIterator = validSheets.iterator(); } catch (InvalidFormatException e){ throw new POIXMLException(e); } catch (XmlException e){ diff --git a/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java index e31254b64..49742dc9d 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java @@ -246,4 +246,23 @@ public final class TestXSSFReader extends TestCase { pkg.close(); } + + /** + * NPE when sheet has no relationship id in the workbook + * 60825 + */ + public void testSheetWithNoRelationshipId() throws Exception { + OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("60825.xlsx"); + ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg); + assertNotNull(strings); + XSSFReader reader = new XSSFReader(pkg); + StylesTable styles = reader.getStylesTable(); + assertNotNull(styles); + + XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) reader.getSheetsData(); + assertNotNull(iter.next()); + assertFalse(iter.hasNext()); + + pkg.close(); + } } diff --git a/test-data/spreadsheet/60825.xlsx b/test-data/spreadsheet/60825.xlsx new file mode 100644 index 000000000..ffcfe08e6 Binary files /dev/null and b/test-data/spreadsheet/60825.xlsx differ