From 8b4cc4c474efe57d52237b14418994e06ab5300a Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Fri, 14 Jun 2013 08:53:29 +0000 Subject: [PATCH] Patch from Trejkaz from GitHub Pull 2 - HSSFWorkbook.getAllEmbeddedObjects() needs to recurse into container Shapes (with new unit test) git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1493001 13f79535-47bb-0310-9956-ffa450edef68 --- .../poi/hssf/usermodel/HSSFWorkbook.java | 17 +++++++++--- .../hssf/usermodel/TestEmbeddedObjects.java | 27 ++++++++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 9d1873b3c3..4b2bbdb948 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -1723,13 +1723,24 @@ public final class HSSFWorkbook extends POIDocument implements org.apache.poi.ss if (null == patriarch){ return; } - for (HSSFShape shape: patriarch.getChildren()){ - if (shape instanceof HSSFObjectData){ + getAllEmbeddedObjects(patriarch, objects); + } + /** + * Recursively iterates a shape container to get all embedded objects. + * + * @param parent the parent. + * @param objects the list of embedded objects to populate. + */ + private void getAllEmbeddedObjects(HSSFShapeContainer parent, List objects) + { + for (HSSFShape shape : parent.getChildren()) { + if (shape instanceof HSSFObjectData) { objects.add((HSSFObjectData) shape); + } else if (shape instanceof HSSFShapeContainer) { + getAllEmbeddedObjects((HSSFShapeContainer) shape, objects); } } } - public HSSFCreationHelper getCreationHelper() { return new HSSFCreationHelper(this); } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestEmbeddedObjects.java b/src/testcases/org/apache/poi/hssf/usermodel/TestEmbeddedObjects.java index c7d478e4f8..fe04ebb3a1 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestEmbeddedObjects.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestEmbeddedObjects.java @@ -24,11 +24,9 @@ import java.io.IOException; import java.util.List; /** - * @author Evgeniy Berlog - * @date 13.07.12 + * Tests for the embedded object fetching support in HSSF */ public class TestEmbeddedObjects extends TestCase{ - public void testReadExistingObject() throws IOException { HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls"); List list = wb.getAllEmbeddedObjects(); @@ -38,4 +36,27 @@ public class TestEmbeddedObjects extends TestCase{ assertNotNull(obj.getDirectory()); assertNotNull(obj.getOLE2ClassName()); } + + /** + * Need to recurse into the shapes to find this one + * See https://github.com/apache/poi/pull/2 + */ + public void testReadNestedObject() throws IOException { + HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("WithCheckBoxes.xls"); + List list = wb.getAllEmbeddedObjects(); + assertEquals(list.size(), 1); + HSSFObjectData obj = list.get(0); + assertNotNull(obj.getObjectData()); + assertNotNull(obj.getOLE2ClassName()); + } + + /** + * One with large numbers of recursivly embedded resources + * See https://github.com/apache/poi/pull/2 + */ + public void testReadManyNestedObjects() throws IOException { + HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("45538_form_Header.xls"); + List list = wb.getAllEmbeddedObjects(); + assertEquals(list.size(), 40); + } } -- 2.39.5