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
This commit is contained in:
PJ Fanning 2021-02-13 19:43:07 +00:00
parent 79a9cf3692
commit 49fe3ba330
2 changed files with 39 additions and 3 deletions

View File

@ -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

View File

@ -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 {