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 31e20e58a7..3a13bfb07e 100644 --- a/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java +++ b/src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java @@ -82,6 +82,16 @@ public class XSSFReader { * Creates a new XSSFReader, for the given package */ public XSSFReader(OPCPackage pkg) throws IOException, OpenXML4JException { + this(pkg, false); + } + + /** + * Creates a new XSSFReader, for the given package + * + * @param pkg an OPCPackage representing a spreasheet file + * @param allowStrictOoxmlFiles whether to try to handle Strict OOXML format files + */ + public XSSFReader(OPCPackage pkg, boolean allowStrictOoxmlFiles) throws IOException, OpenXML4JException { this.pkg = pkg; PackageRelationship coreDocRelationship = this.pkg.getRelationshipsByType( @@ -91,19 +101,23 @@ public class XSSFReader { // this code is similar to POIXMLDocumentPart.getPartFromOPCPackage(), but I could not combine it // easily due to different return values if (coreDocRelationship == null) { - if (this.pkg.getRelationshipsByType( + if (allowStrictOoxmlFiles) { + coreDocRelationship = this.pkg.getRelationshipsByType( + PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0); + } else if (this.pkg.getRelationshipsByType( PackageRelationshipTypes.STRICT_CORE_DOCUMENT).getRelationship(0) != null) { throw new POIXMLException("Strict OOXML isn't currently supported, please see bug #57699"); } - throw new POIXMLException("OOXML file structure broken/invalid - no core document found!"); + if (coreDocRelationship == null) { + throw new POIXMLException("OOXML file structure broken/invalid - no core document found!"); + } } // Get the part that holds the workbook workbookPart = this.pkg.getPart(coreDocRelationship); } - /** * Opens up the Shared Strings Table, parses it, and * returns a handy object for working with 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 70c78b3184..697af659c7 100644 --- a/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java +++ b/src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java @@ -334,6 +334,28 @@ public final class TestXSSFReader { } } + @Test + void testStrictOoxmlNotAllowed() throws Exception { + assertThrows(POIXMLException.class, () -> { + try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("sample.strict.xlsx"))) { + XSSFReader reader = new XSSFReader(pkg); + } + }); + assertThrows(POIXMLException.class, () -> { + try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("sample.strict.xlsx"))) { + XSSFReader reader = new XSSFReader(pkg, false); + } + }); + } + + @Test + void testStrictOoxmlAllowed() throws Exception { + try (OPCPackage pkg = OPCPackage.open(_ssTests.openResourceAsStream("sample.strict.xlsx"))) { + XSSFReader reader = new XSSFReader(pkg, true); + assertNotNull(reader.pkg); + } + } + private static String hash(XSSFReader reader) throws IOException { Iterable iter = () -> { try {