From 489bebba0ee749cc961ce092bb4007d7c23343d2 Mon Sep 17 00:00:00 2001 From: Tim Allison Date: Thu, 20 Oct 2016 18:45:03 +0000 Subject: [PATCH] BUG-60285 avoid NPE if missing relationship id git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1765861 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/xssf/eventusermodel/XSSFReader.java | 12 ++++++++++- .../xssf/eventusermodel/TestXSSFReader.java | 19 ++++++++++++++++++ test-data/spreadsheet/60825.xlsx | Bin 0 -> 6524 bytes 3 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 test-data/spreadsheet/60825.xlsx 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 8d50bc62cd..2accb02657 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 e31254b641..49742dc9d9 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 0000000000000000000000000000000000000000..ffcfe08e619a852608f2692c7516ba5ca2261e04 GIT binary patch literal 6524 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