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 {