Bug 57914: Provide a better error message for OOXML strict format which we do not support yet.
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1732619 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
5a87a089be
commit
da1879c1b2
@ -254,6 +254,7 @@ public class TestAllFiles {
|
|||||||
EXPECTED_FAILURES.add("spreadsheet/SampleSS.strict.xlsx");
|
EXPECTED_FAILURES.add("spreadsheet/SampleSS.strict.xlsx");
|
||||||
EXPECTED_FAILURES.add("spreadsheet/SimpleStrict.xlsx");
|
EXPECTED_FAILURES.add("spreadsheet/SimpleStrict.xlsx");
|
||||||
EXPECTED_FAILURES.add("spreadsheet/sample.strict.xlsx");
|
EXPECTED_FAILURES.add("spreadsheet/sample.strict.xlsx");
|
||||||
|
EXPECTED_FAILURES.add("spreadsheet/57914.xlsx");
|
||||||
|
|
||||||
// non-TNEF files
|
// non-TNEF files
|
||||||
EXPECTED_FAILURES.add("ddf/Container.dat");
|
EXPECTED_FAILURES.add("ddf/Container.dat");
|
||||||
|
@ -273,13 +273,13 @@ public final class PackageRelationshipCollection implements
|
|||||||
if (index < 0 || index > relationshipsByID.values().size())
|
if (index < 0 || index > relationshipsByID.values().size())
|
||||||
throw new IllegalArgumentException("index");
|
throw new IllegalArgumentException("index");
|
||||||
|
|
||||||
PackageRelationship retRel = null;
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
for (PackageRelationship rel : relationshipsByID.values()) {
|
for (PackageRelationship rel : relationshipsByID.values()) {
|
||||||
if (index == i++)
|
if (index == i++)
|
||||||
return rel;
|
return rel;
|
||||||
}
|
}
|
||||||
return retRel;
|
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -69,6 +69,18 @@ public class XSSFReader {
|
|||||||
PackageRelationship coreDocRelationship = this.pkg.getRelationshipsByType(
|
PackageRelationship coreDocRelationship = this.pkg.getRelationshipsByType(
|
||||||
PackageRelationshipTypes.CORE_DOCUMENT).getRelationship(0);
|
PackageRelationshipTypes.CORE_DOCUMENT).getRelationship(0);
|
||||||
|
|
||||||
|
// strict OOXML likely not fully supported, see #57699
|
||||||
|
// 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(
|
||||||
|
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!");
|
||||||
|
}
|
||||||
|
|
||||||
// Get the part that holds the workbook
|
// Get the part that holds the workbook
|
||||||
workbookPart = this.pkg.getPart(coreDocRelationship);
|
workbookPart = this.pkg.getPart(coreDocRelationship);
|
||||||
}
|
}
|
||||||
|
@ -21,8 +21,8 @@ import java.io.InputStream;
|
|||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import org.apache.poi.POIDataSamples;
|
||||||
|
import org.apache.poi.POIXMLException;
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import org.apache.poi.openxml4j.opc.OPCPackage;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
import org.apache.poi.xssf.XSSFTestDataSamples;
|
import org.apache.poi.xssf.XSSFTestDataSamples;
|
||||||
@ -31,7 +31,8 @@ import org.apache.poi.xssf.model.StylesTable;
|
|||||||
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
|
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFShape;
|
import org.apache.poi.xssf.usermodel.XSSFShape;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFSimpleShape;
|
import org.apache.poi.xssf.usermodel.XSSFSimpleShape;
|
||||||
import org.apache.poi.POIDataSamples;
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link XSSFReader}
|
* Tests for {@link XSSFReader}
|
||||||
@ -168,35 +169,61 @@ public final class TestXSSFReader extends TestCase {
|
|||||||
stream.close();
|
stream.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/**
|
|
||||||
* Test text extraction from text box using getShapes()
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public void testShapes() throws Exception{
|
|
||||||
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("WithTextBox.xlsx");
|
|
||||||
XSSFReader r = new XSSFReader(pkg);
|
|
||||||
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator)r.getSheetsData();
|
|
||||||
|
|
||||||
StringBuilder sb = new StringBuilder();
|
/**
|
||||||
while(it.hasNext())
|
* Test text extraction from text box using getShapes()
|
||||||
{
|
*
|
||||||
it.next();
|
* @throws Exception
|
||||||
List<XSSFShape> shapes = it.getShapes();
|
*/
|
||||||
if (shapes != null){
|
public void testShapes() throws Exception {
|
||||||
for (XSSFShape shape : shapes){
|
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("WithTextBox.xlsx");
|
||||||
if (shape instanceof XSSFSimpleShape){
|
XSSFReader r = new XSSFReader(pkg);
|
||||||
String t = ((XSSFSimpleShape)shape).getText();
|
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
|
||||||
sb.append(t).append('\n');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
String text = sb.toString();
|
|
||||||
assertTrue(text.indexOf("Line 1") > -1);
|
|
||||||
assertTrue(text.indexOf("Line 2") > -1);
|
|
||||||
assertTrue(text.indexOf("Line 3") > -1);
|
|
||||||
|
|
||||||
}
|
String text = getShapesString(it);
|
||||||
|
assertTrue(text.contains("Line 1"));
|
||||||
|
assertTrue(text.contains("Line 2"));
|
||||||
|
assertTrue(text.contains("Line 3"));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getShapesString(XSSFReader.SheetIterator it) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
it.next();
|
||||||
|
List<XSSFShape> shapes = it.getShapes();
|
||||||
|
if (shapes != null) {
|
||||||
|
for (XSSFShape shape : shapes) {
|
||||||
|
if (shape instanceof XSSFSimpleShape) {
|
||||||
|
String t = ((XSSFSimpleShape) shape).getText();
|
||||||
|
sb.append(t).append('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testBug57914() throws Exception {
|
||||||
|
OPCPackage pkg = XSSFTestDataSamples.openSamplePackage("57914.xlsx");
|
||||||
|
final XSSFReader r;
|
||||||
|
|
||||||
|
// for now expect this to fail, when we fix 57699, this one should fail so we know we should adjust
|
||||||
|
// this test as well
|
||||||
|
try {
|
||||||
|
r = new XSSFReader(pkg);
|
||||||
|
fail("This will fail until bug 57699 is fixed");
|
||||||
|
} catch (POIXMLException e) {
|
||||||
|
assertTrue("Had " + e, e.getMessage().contains("57699"));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
XSSFReader.SheetIterator it = (XSSFReader.SheetIterator) r.getSheetsData();
|
||||||
|
|
||||||
|
String text = getShapesString(it);
|
||||||
|
assertTrue(text.contains("Line 1"));
|
||||||
|
assertTrue(text.contains("Line 2"));
|
||||||
|
assertTrue(text.contains("Line 3"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NPE from XSSFReader$SheetIterator.<init> on XLSX files generated by
|
* NPE from XSSFReader$SheetIterator.<init> on XLSX files generated by
|
||||||
|
BIN
test-data/spreadsheet/57914.xlsx
Normal file
BIN
test-data/spreadsheet/57914.xlsx
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user