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<HSSFObjectData> 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);
}
import java.util.List;\r
\r
/**\r
- * @author Evgeniy Berlog\r
- * @date 13.07.12\r
+ * Tests for the embedded object fetching support in HSSF\r
*/\r
public class TestEmbeddedObjects extends TestCase{\r
- \r
public void testReadExistingObject() throws IOException {\r
HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("drawings.xls");\r
List<HSSFObjectData> list = wb.getAllEmbeddedObjects();\r
assertNotNull(obj.getDirectory());\r
assertNotNull(obj.getOLE2ClassName());\r
}\r
+ \r
+ /**\r
+ * Need to recurse into the shapes to find this one\r
+ * See https://github.com/apache/poi/pull/2\r
+ */\r
+ public void testReadNestedObject() throws IOException {\r
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("WithCheckBoxes.xls");\r
+ List<HSSFObjectData> list = wb.getAllEmbeddedObjects();\r
+ assertEquals(list.size(), 1);\r
+ HSSFObjectData obj = list.get(0);\r
+ assertNotNull(obj.getObjectData());\r
+ assertNotNull(obj.getOLE2ClassName());\r
+ }\r
+ \r
+ /**\r
+ * One with large numbers of recursivly embedded resources\r
+ * See https://github.com/apache/poi/pull/2\r
+ */\r
+ public void testReadManyNestedObjects() throws IOException {\r
+ HSSFWorkbook wb = HSSFTestDataSamples.openSampleWorkbook("45538_form_Header.xls");\r
+ List<HSSFObjectData> list = wb.getAllEmbeddedObjects();\r
+ assertEquals(list.size(), 40);\r
+ }\r
}\r