Browse Source

Retrieve chart from graphical frame

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1871012 13f79535-47bb-0310-9956-ffa450edef68
tags/REL_4_1_2
Alain Béarez 4 years ago
parent
commit
bb2ad49a2f

+ 15
- 0
src/examples/src/org/apache/poi/xslf/usermodel/ChartFromScratch.java View 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");
}

+ 35
- 4
src/ooxml/java/org/apache/poi/xslf/usermodel/XSLFGraphicFrame.java View 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();

Loading…
Cancel
Save