diff options
-rw-r--r-- | src/examples/src/org/apache/poi/xslf/usermodel/ChartFromScratch.java | 15 | ||||
-rw-r--r-- | src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java | 39 |
2 files changed, 50 insertions, 4 deletions
diff --git a/src/examples/src/org/apache/poi/xslf/usermodel/ChartFromScratch.java b/src/examples/src/org/apache/poi/xslf/usermodel/ChartFromScratch.java index 637b485bda..c4c0c23a95 100644 --- a/src/examples/src/org/apache/poi/xslf/usermodel/ChartFromScratch.java +++ b/src/examples/src/org/apache/poi/xslf/usermodel/ChartFromScratch.java @@ -21,6 +21,7 @@ package org.apache.poi.xslf.usermodel; import java.awt.geom.Rectangle2D; import java.io.BufferedReader; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.OutputStream; @@ -95,6 +96,20 @@ public class ChartFromScratch { ppt.write(out); } } + try (FileInputStream is = new FileInputStream("chart-from-scratch.pptx")) { + try (XMLSlideShow ppt = new XMLSlideShow(is)) { + for (XSLFSlide slide : ppt.getSlides()) { + for (XSLFShape shape : slide.getShapes()) { + if (shape instanceof XSLFGraphicFrame) { + XSLFGraphicFrame frame = (XSLFGraphicFrame) shape; + if (frame.hasChart()) { + System.out.println(frame.getChart().getTitleShape().getText()); + } + } + } + } + } + } } System.out.println("Done"); } diff --git a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java index 8b9d152848..9ae6c9f956 100644 --- a/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java +++ b/src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java @@ -47,6 +47,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape; @Beta public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFShape, XSLFTextParagraph> { + private static final String DRAWINGML_CHART_URI = "http://schemas.openxmlformats.org/drawingml/2006/chart"; private static final POILogger LOG = POILogFactory.getLogger(XSLFGraphicFrame.class); /*package*/ XSLFGraphicFrame(CTGraphicalObjectFrame shape, XSLFSheet sheet){ @@ -97,7 +98,7 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh return new XSLFGraphicFrame(shape, sheet); } } - + private static String getUri(CTGraphicalObjectFrame shape) { final CTGraphicalObject g = shape.getGraphic(); if (g == null) { @@ -160,15 +161,45 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh return false; } + public boolean hasChart() { + String uri = getGraphicalData().getUri(); + return uri.equals(DRAWINGML_CHART_URI); + } + + private CTGraphicalObjectData getGraphicalData() { + return ((CTGraphicalObjectFrame)getXmlObject()).getGraphic().getGraphicData(); + } + + public XSLFChart getChart() { + if (hasChart()) { + String id = null; + String xpath = "declare namespace c='" + DRAWINGML_CHART_URI + "' c:chart"; + XmlObject[] obj = getGraphicalData().selectPath(xpath); + if (obj != null && obj.length == 1) { + XmlCursor c = obj[0].newCursor(); + QName idQualifiedName = new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "id"); + id = c.getAttributeText(idQualifiedName); + c.dispose(); + } + if (id == null) { + return null; + } else { + return (XSLFChart) getSheet().getRelationById(id); + } + } else { + return null; + } + } + @Override void copy(XSLFShape sh){ super.copy(sh); - CTGraphicalObjectData data = ((CTGraphicalObjectFrame)getXmlObject()).getGraphic().getGraphicData(); + CTGraphicalObjectData data = getGraphicalData(); String uri = data.getUri(); if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){ copyDiagram(data, (XSLFGraphicFrame)sh); - } if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/chart")){ + } if(uri.equals(DRAWINGML_CHART_URI)){ copyChart(data, (XSLFGraphicFrame)sh); } else { // TODO support other types of objects @@ -179,7 +210,7 @@ public class XSLFGraphicFrame extends XSLFShape implements GraphicalFrame<XSLFSh private void copyChart(CTGraphicalObjectData objData, XSLFGraphicFrame srcShape) { XSLFSlide slide = (XSLFSlide) getSheet(); XSLFSheet src = srcShape.getSheet(); - String xpath = "declare namespace c='http://schemas.openxmlformats.org/drawingml/2006/chart' c:chart"; + String xpath = "declare namespace c='" + DRAWINGML_CHART_URI + "' c:chart"; XmlObject[] obj = objData.selectPath(xpath); if (obj != null && obj.length == 1) { XmlCursor c = obj[0].newCursor(); |