diff options
author | PJ Fanning <fanningpj@apache.org> | 2021-02-13 19:43:07 +0000 |
---|---|---|
committer | PJ Fanning <fanningpj@apache.org> | 2021-02-13 19:43:07 +0000 |
commit | 49fe3ba330a62259f6eadc398ae31265c474d1ef (patch) | |
tree | c4ea8a06c5eb3a5d5b64a6b2ef3976c64f234dae /src | |
parent | 79a9cf36926d3c6f634768fc0fb0895ebe8c87b0 (diff) | |
download | poi-49fe3ba330a62259f6eadc398ae31265c474d1ef.tar.gz poi-49fe3ba330a62259f6eadc398ae31265c474d1ef.zip |
allo XSSFReader to be sublclassed with implementation that allows OOXMl Strict files
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1886493 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r-- | src/ooxml/java/org/apache/poi/xssf/eventusermodel/XSSFReader.java | 20 | ||||
-rw-r--r-- | src/ooxml/testcases/org/apache/poi/xssf/eventusermodel/TestXSSFReader.java | 22 |
2 files changed, 39 insertions, 3 deletions
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 <code>OPCPackage</code> 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<InputStream> iter = () -> { try { |