From bd237e24835c1ac84cf56e5709757bc616d1051a Mon Sep 17 00:00:00 2001 From: Andreas Beeker Date: Sun, 16 Apr 2017 22:41:28 +0000 Subject: [PATCH] #60996 - XSSF: Multiple embedded objects on same sheet are ignored git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1791644 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hssf/usermodel/HSSFSimpleShape.java | 5 + .../apache/poi/ss/usermodel/SimpleShape.java | 8 +- .../poi/xssf/usermodel/XSSFDrawing.java | 25 ++++- .../poi/xssf/usermodel/XSSFObjectData.java | 2 +- .../poi/xssf/usermodel/XSSFSimpleShape.java | 5 + .../poi/ss/usermodel/TestEmbedOLEPackage.java | 91 ++++++++++++------- 6 files changed, 98 insertions(+), 38 deletions(-) diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java b/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java index 4e405cae4..1082362a4 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFSimpleShape.java @@ -263,4 +263,9 @@ public class HSSFSimpleShape extends HSSFShape implements SimpleShape } return _textObjectRecord; } + + @Override + public int getShapeId(){ + return super.getShapeId(); + } } diff --git a/src/java/org/apache/poi/ss/usermodel/SimpleShape.java b/src/java/org/apache/poi/ss/usermodel/SimpleShape.java index 2d65fd853..fe97c850f 100644 --- a/src/java/org/apache/poi/ss/usermodel/SimpleShape.java +++ b/src/java/org/apache/poi/ss/usermodel/SimpleShape.java @@ -19,10 +19,14 @@ package org.apache.poi.ss.usermodel; /** * A common interface for simple shapes. - * (Currently the HSSF and XSSF classes don't share common method signatures ...) * * @since POI 3.16-beta2 */ public interface SimpleShape extends Shape { - + /** + * @return the shape id, which is unique within the sheet + * + * @since POI 3.17-beta1 + */ + int getShapeId(); } diff --git a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java index 35f71381c..42518fa9f 100644 --- a/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java +++ b/src/ooxml/java/org/apache/poi/xssf/usermodel/XSSFDrawing.java @@ -385,7 +385,24 @@ public final class XSSFDrawing extends POIXMLDocumentPart implements Drawing pat = sh.createDrawingPatriarch(); - ClientAnchor anchor = pat.createAnchor(0, 0, 0, 0, 1, 1, 3, 6); - pat.createObjectData(anchor, oleIdx, picIdx); + addEmbeddedObjects(wb1); Workbook wb2 = XSSFTestDataSamples.writeOutAndReadBack(wb1); - - pat = wb2.getSheetAt(0).getDrawingPatriarch(); - assertTrue(pat.iterator().next() instanceof ObjectData); - - EmbeddedExtractor ee = new EmbeddedExtractor(); - EmbeddedData ed = ee.extractAll(wb2.getSheetAt(0)).get(0); - assertArrayEquals(samplePPTX, ed.getEmbeddedData()); + validateEmbeddedObjects(wb2); wb2.close(); wb1.close(); @@ -73,32 +75,55 @@ public class TestEmbedOLEPackage { } Workbook wb1 = new HSSFWorkbook(); - Sheet sh = wb1.createSheet(); - int picIdx = wb1.addPicture(getSamplePng(), Workbook.PICTURE_TYPE_PNG); - byte samplePPT[] = getSamplePPT(false); - int oleIdx = wb1.addOlePackage(samplePPT, "dummy.ppt", "dummy.ppt", "dummy.ppt"); - - Drawing pat = sh.createDrawingPatriarch(); - ClientAnchor anchor = pat.createAnchor(0, 0, 0, 0, 1, 1, 3, 6); - pat.createObjectData(anchor, oleIdx, picIdx); - + addEmbeddedObjects(wb1); Workbook wb2 = HSSFTestDataSamples.writeOutAndReadBack((HSSFWorkbook)wb1); - - pat = wb2.getSheetAt(0).getDrawingPatriarch(); - assertTrue(pat.iterator().next() instanceof ObjectData); - - EmbeddedExtractor ee = new EmbeddedExtractor(); - EmbeddedData ed = ee.extractAll(wb2.getSheetAt(0)).get(0); - assertArrayEquals(samplePPT, ed.getEmbeddedData()); + validateEmbeddedObjects(wb2); wb2.close(); wb1.close(); } - static byte[] getSamplePng() { - return POIDataSamples.getSpreadSheetInstance().readFile("logoKarmokar4.png"); + static void validateEmbeddedObjects(Workbook wb) throws IOException { + boolean ooxml = wb.getClass().getName().toLowerCase().contains("xssf"); + byte data[] = (ooxml) ? samplePPTX : samplePPT; + Iterator shapeIds = Arrays.asList(1025,1026,2049).iterator(); + EmbeddedExtractor ee = new EmbeddedExtractor(); + for (Sheet sheet : wb) { + Drawing pat = sheet.getDrawingPatriarch(); + for (Shape shape : pat) { + assertTrue(shape instanceof ObjectData); + ObjectData od = (ObjectData)shape; + EmbeddedData ed = ee.extractOne((DirectoryNode)od.getDirectory()); + assertArrayEquals(data, ed.getEmbeddedData()); + assertArrayEquals(samplePNG, od.getPictureData().getData()); + assertEquals((int)shapeIds.next(), od.getShapeId()); + } + } } + + static void addEmbeddedObjects(Workbook wb) throws IOException { + boolean ooxml = wb.getClass().getName().toLowerCase().contains("xssf"); + int picIdx = wb.addPicture(samplePNG, Workbook.PICTURE_TYPE_PNG); + byte data[] = (ooxml) ? samplePPTX : samplePPT; + String ext = (ooxml) ? ".pptx" : ".ppt"; + + int oleIdx1a = wb.addOlePackage(data, "dummy1a"+ext, "dummy1a"+ext, "dummy1a"+ext); + int oleIdx1b = wb.addOlePackage(data, "dummy1b"+ext, "dummy1b"+ext, "dummy1b"+ext); + int oleIdx2 = wb.addOlePackage(data, "dummy2"+ext, "dummy2"+ext, "dummy2"+ext); + + Sheet sh1 = wb.createSheet(); + Drawing pat1 = sh1.createDrawingPatriarch(); + ClientAnchor anchor1a = pat1.createAnchor(0, 0, 0, 0, 1, 1, 3, 6); + pat1.createObjectData(anchor1a, oleIdx1a, picIdx); + ClientAnchor anchor1b = pat1.createAnchor(0, 0, 0, 0, 1, 1+7, 3, 6+7); + pat1.createObjectData(anchor1b, oleIdx1b, picIdx); + Sheet sh2 = wb.createSheet(); + Drawing pat2 = sh2.createDrawingPatriarch(); + ClientAnchor anchor2 = pat2.createAnchor(0, 0, 0, 0, 1, 1, 3, 6); + pat2.createObjectData(anchor2, oleIdx2, picIdx); + } + static byte[] getSamplePPT(boolean ooxml) throws IOException { SlideShow ppt = (ooxml) ? new XMLSlideShow() : new org.apache.poi.hslf.usermodel.HSLFSlideShow(); Slide slide = ppt.createSlide();