]> source.dussan.org Git - poi.git/commitdiff
Retrieve chart from graphical frame
authorAlain Béarez <abearez@apache.org>
Sat, 7 Dec 2019 23:39:20 +0000 (23:39 +0000)
committerAlain Béarez <abearez@apache.org>
Sat, 7 Dec 2019 23:39:20 +0000 (23:39 +0000)
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1871012 13f79535-47bb-0310-9956-ffa450edef68

src/examples/src/org/apache/poi/xslf/usermodel/ChartFromScratch.java
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java

index 637b485bda67127cb905a2a921be1ad5e9aec9c5..c4c0c23a958b366c59779940a17d97e699748401 100644 (file)
@@ -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");
     }
index 8b9d15284863d23a5ce85f094e5f22288920f2a7..9ae6c9f9562b13631cd188a2d19341d752004a18 100644 (file)
@@ -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();