Java使用APACHE POI在PowerPoint中创建图表

我们如何使用apache poi在Java中的ppt中创建图表。我们使用哪种POI API。下面是我用来创建文本框的代码

XSLFSlide slide = pptx.createSlide();

XSLFTextShape textShape = slide.createTextBox();

textShape.setText(data);

幻灯片对象不包含任何用于创建图表的api。

有什么解决办法吗?

提前致谢

回答:

到现在为止,XSLFChartShapePowerPoint幻灯片中还没有可用的东西apache poi

不过,当然,如果一个人知道所述的内部结构*.pptxZIP归档文件和XML在其中,则有可能使用从头创建这个apache poi

OPCPackage类和低电平CT*从类org.openxmlformats.schemas.drawingml.x2006.*org.openxmlformats.schemas.presentationml.x2006.*

下面的代码将执行此操作,并创建一个包含饼图和条形图的幻灯片。

这只是一个草稿,仅显示了该方法。

import java.io.*;

import org.apache.poi.*;

import org.apache.poi.xslf.usermodel.*;

import org.apache.poi.util.*;

import org.apache.poi.openxml4j.opc.*;

import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;

import org.apache.xmlbeans.*;

import org.openxmlformats.schemas.drawingml.x2006.chart.*;

import org.openxmlformats.schemas.drawingml.x2006.main.*;

import org.openxmlformats.schemas.presentationml.x2006.main.*;

import javax.xml.namespace.QName;

import java.util.regex.Pattern;

import java.awt.geom.Rectangle2D;

import java.awt.Rectangle;

public class CreatePPTXCharts {

public CreatePPTXCharts() throws Exception {

XMLSlideShow slideShow = new XMLSlideShow();

XSLFSlide slide = slideShow.createSlide();

MyXSLFChartShape myXSLFChartShape = createXSLFChart(slide);

myXSLFChartShape.setAnchor(new Rectangle(50,100,300,300));

drawPieChart(myXSLFChartShape);

myXSLFChartShape = createXSLFChart(slide);

myXSLFChartShape.setAnchor(new Rectangle(370,100,300,300));

drawBarChart(myXSLFChartShape);

FileOutputStream out = new FileOutputStream("CreatePPTXCharts.pptx");

slideShow.write(out);

out.close();

}

//a method for creating the chart XML document /ppt/charts/chart*.xml in the *.pptx ZIP archive

//and creating a MyXSLFChartShape as slide shape

public MyXSLFChartShape createXSLFChart(XSLFSlide slide) throws Exception {

OPCPackage oPCPackage = slide.getSlideShow().getPackage();

int chartCount = oPCPackage.getPartsByName(Pattern.compile("/ppt/charts/chart.*")).size() + 1;

PackagePartName partName = PackagingURIHelper.createPartName("/ppt/charts/chart" + chartCount + ".xml");

PackagePart part = oPCPackage.createPart(partName, "application/vnd.openxmlformats-officedocument.drawingml.chart+xml");

MyXSLFChart myXSLFChart = new MyXSLFChart(part);

MyXSLFChartShape myXSLFChartShape = new MyXSLFChartShape(slide, myXSLFChart);

return myXSLFChartShape;

}

public void drawPieChart(MyXSLFChartShape myXSLFChartShape) {

CTChartSpace chartSpace = myXSLFChartShape.getMyXSLFChart().getChartSpace();

CTPieChart cTPieChart = chartSpace.addNewChart().addNewPlotArea().addNewPieChart();

cTPieChart.addNewVaryColors().setVal(true);

CTPieSer cTPieSer = cTPieChart.addNewSer();

cTPieSer.addNewIdx().setVal(0);

CTStrRef cTStrRef = cTPieSer.addNewTx().addNewStrRef();

cTStrRef.setF("Label 0");

cTStrRef.addNewStrCache().addNewPtCount().setVal(1);

CTStrVal cTStrVal = cTStrRef.getStrCache().addNewPt();

cTStrVal.setIdx(0);

cTStrVal.setV("Val");

cTStrRef = cTPieSer.addNewCat().addNewStrRef();

cTStrRef.setF("Categories");

cTStrRef.addNewStrCache().addNewPtCount().setVal(3);

for (int r = 1; r < 4; r++) {

cTStrVal = cTStrRef.getStrCache().addNewPt();

cTStrVal.setIdx(r-1);

cTStrVal.setV("Cat" + r);

}

CTNumRef cTNumRef = cTPieSer.addNewVal().addNewNumRef();

cTNumRef.setF("0");

cTNumRef.addNewNumCache().addNewPtCount().setVal(3);

for (int r = 1; r < 4; r++) {

CTNumVal cTNumVal = cTNumRef.getNumCache().addNewPt();

cTNumVal.setIdx(r-1);

cTNumVal.setV("" + (10*r));

}

}

public void drawBarChart(MyXSLFChartShape myXSLFChartShape) {

CTChartSpace chartSpace = myXSLFChartShape.getMyXSLFChart().getChartSpace();

CTChart cTChart = chartSpace.addNewChart();

CTPlotArea cTPlotArea = cTChart.addNewPlotArea();

CTBarChart cTBarChart = cTPlotArea.addNewBarChart();

cTBarChart.addNewVaryColors().setVal(true);

cTBarChart.addNewBarDir().setVal(STBarDir.COL);

for (int r = 1; r < 5; r++) {

CTBarSer cTBarSer = cTBarChart.addNewSer();

CTStrRef cTStrRef = cTBarSer.addNewTx().addNewStrRef();

cTStrRef.setF("Label " + r);

cTStrRef.addNewStrCache().addNewPtCount().setVal(1);

CTStrVal cTStrVal = cTStrRef.getStrCache().addNewPt();

cTStrVal.setIdx(0);

cTStrVal.setV("Val" + r);

cTBarSer.addNewIdx().setVal(r-1);

cTStrRef = cTBarSer.addNewCat().addNewStrRef();

cTStrRef.setF("Categories");

cTStrRef.addNewStrCache().addNewPtCount().setVal(3);

for (int c = 1; c < 4; c++) {

cTStrVal = cTStrRef.getStrCache().addNewPt();

cTStrVal.setIdx(c-1);

cTStrVal.setV("Cat" + c);

}

CTNumRef cTNumRef = cTBarSer.addNewVal().addNewNumRef();

cTNumRef.setF("" + r);

cTNumRef.addNewNumCache().addNewPtCount().setVal(3);

for (int c = 1; c < 4; c++) {

CTNumVal cTNumVal = cTNumRef.getNumCache().addNewPt();

cTNumVal.setIdx(c-1);

cTNumVal.setV("" + ((10+r)*c));

}

}

//telling the BarChart that it has axes and giving them Ids

cTBarChart.addNewAxId().setVal(123456);

cTBarChart.addNewAxId().setVal(123457);

//cat axis

CTCatAx cTCatAx = cTPlotArea.addNewCatAx();

cTCatAx.addNewAxId().setVal(123456); //id of the cat axis

CTScaling cTScaling = cTCatAx.addNewScaling();

cTScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);

cTCatAx.addNewDelete().setVal(false);

cTCatAx.addNewAxPos().setVal(STAxPos.B);

cTCatAx.addNewCrossAx().setVal(123457); //id of the val axis

cTCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

//val axis

CTValAx cTValAx = cTPlotArea.addNewValAx();

cTValAx.addNewAxId().setVal(123457); //id of the val axis

cTScaling = cTValAx.addNewScaling();

cTScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);

cTValAx.addNewDelete().setVal(false);

cTValAx.addNewAxPos().setVal(STAxPos.L);

cTValAx.addNewCrossAx().setVal(123456); //id of the cat axis

cTValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

//legend

CTLegend cTLegend = cTChart.addNewLegend();

cTLegend.addNewLegendPos().setVal(STLegendPos.B);

cTLegend.addNewOverlay().setVal(false);

}

public static void main(String[] args) throws Exception {

CreatePPTXCharts createPPTXCharts = new CreatePPTXCharts();

}

//________________________________________________________________________

//a class for providing a MyXSLFChartShape

private class MyXSLFChartShape {

private CTGraphicalObjectFrame _graphicalObjectFrame;

private XSLFSlide slide;

private MyXSLFChart myXSLFChart;

MyXSLFChartShape(XSLFSlide slide, MyXSLFChart myXSLFChart) throws Exception {

String rId = "rId" + (slide.getRelationParts().size()+1);

slide.addRelation(rId, XSLFRelation.CHART, myXSLFChart);

long cNvPrId = 1;

String cNvPrName = "MyChart";

int cNvPrNameCount = 1;

for (CTGraphicalObjectFrame currGraphicalObjectFrame : slide.getXmlObject().getCSld().getSpTree().getGraphicFrameList()) {

if (currGraphicalObjectFrame.getNvGraphicFramePr() != null) {

if (currGraphicalObjectFrame.getNvGraphicFramePr().getCNvPr() != null) {

cNvPrId++;

if (currGraphicalObjectFrame.getNvGraphicFramePr().getCNvPr().getName().startsWith(cNvPrName)) {

cNvPrNameCount++;

}

}

}

}

CTGraphicalObjectFrame graphicalObjectFrame = slide.getXmlObject().getCSld().getSpTree().addNewGraphicFrame();

CTGraphicalObjectFrameNonVisual cTGraphicalObjectFrameNonVisual = graphicalObjectFrame.addNewNvGraphicFramePr();

cTGraphicalObjectFrameNonVisual.addNewCNvGraphicFramePr();

cTGraphicalObjectFrameNonVisual.addNewNvPr();

CTNonVisualDrawingProps cTNonVisualDrawingProps = cTGraphicalObjectFrameNonVisual.addNewCNvPr();

cTNonVisualDrawingProps.setId(cNvPrId);

cTNonVisualDrawingProps.setName("MyChart" + cNvPrNameCount);

CTGraphicalObject graphicalObject = graphicalObjectFrame.addNewGraphic();

CTGraphicalObjectData graphicalObjectData = CTGraphicalObjectData.Factory.parse(

"<c:chart xmlns:c=\"http://schemas.openxmlformats.org/drawingml/2006/chart\" "

+"xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" "

+"r:id=\"" + rId + "\"/>"

);

graphicalObjectData.setUri("http://schemas.openxmlformats.org/drawingml/2006/chart");

graphicalObject.setGraphicData(graphicalObjectData);

_graphicalObjectFrame = graphicalObjectFrame;

this.slide = slide;

this.myXSLFChart = myXSLFChart;

this.setAnchor(new Rectangle());

}

private void setAnchor(Rectangle2D anchor) {

CTTransform2D xfrm = (_graphicalObjectFrame.getXfrm() != null) ? _graphicalObjectFrame.getXfrm() : _graphicalObjectFrame.addNewXfrm();

CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();

long x = Units.toEMU(anchor.getX());

long y = Units.toEMU(anchor.getY());

off.setX(x);

off.setY(y);

CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm.addNewExt();

long cx = Units.toEMU(anchor.getWidth());

long cy = Units.toEMU(anchor.getHeight());

ext.setCx(cx);

ext.setCy(cy);

}

private MyXSLFChart getMyXSLFChart() {

return myXSLFChart;

}

}

//a wrapper class for the ChartSpaceDocument /ppt/charts/chart*.xml in the *.pptx ZIP archive

private class MyXSLFChart extends POIXMLDocumentPart {

private CTChartSpace chartSpace;

private MyXSLFChart(PackagePart part) throws Exception {

super(part);

chartSpace = ChartSpaceDocument.Factory.newInstance().addNewChartSpace();

}

private CTChartSpace getChartSpace() {

return chartSpace;

}

@Override

protected void commit() throws IOException {

XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);

xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));

PackagePart part = getPackagePart();

OutputStream out = part.getOutputStream();

chartSpace.save(out, xmlOptions);

out.close();

}

}

}

产生与XSSFWorkbook数据表相同但具有的代码。

import java.io.*;

import org.apache.poi.*;

import org.apache.poi.xslf.usermodel.*;

import org.apache.poi.xssf.usermodel.*;

import org.apache.poi.ss.usermodel.*;

import org.apache.poi.ss.util.*;

import org.apache.poi.util.*;

import org.apache.poi.openxml4j.opc.*;

import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;

import org.apache.xmlbeans.*;

import org.openxmlformats.schemas.drawingml.x2006.chart.*;

import org.openxmlformats.schemas.drawingml.x2006.main.*;

import org.openxmlformats.schemas.presentationml.x2006.main.*;

import javax.xml.namespace.QName;

import java.util.HashMap;

import java.util.Map;

import java.util.List;

import java.util.regex.Pattern;

import java.awt.geom.Rectangle2D;

import java.awt.Rectangle;

public class CreatePPTXChartsXSSFWb {

public CreatePPTXChartsXSSFWb() throws Exception {

XMLSlideShow slideShow = new XMLSlideShow();

XSLFSlide slide = slideShow.createSlide();

MyXSLFChartShape myXSLFChartShape = createXSLFChart(slide);

myXSLFChartShape.setAnchor(new Rectangle(50,100,300,300));

drawPieChart(myXSLFChartShape);

myXSLFChartShape = createXSLFChart(slide);

myXSLFChartShape.setAnchor(new Rectangle(370,100,300,300));

drawBarChart(myXSLFChartShape);

FileOutputStream out = new FileOutputStream("CreatePPTXChartsXSSFWb.pptx");

slideShow.write(out);

out.close();

}

//a method for creating the chart XML document /ppt/charts/chart*.xml in the *.pptx ZIP archive

//and creating a MyXSLFChartShape as slide shape

public MyXSLFChartShape createXSLFChart(XSLFSlide slide) throws Exception {

OPCPackage oPCPackage = slide.getSlideShow().getPackage();

int chartCount = oPCPackage.getPartsByName(Pattern.compile("/ppt/charts/chart.*")).size() + 1;

PackagePartName partName = PackagingURIHelper.createPartName("/ppt/charts/chart" + chartCount + ".xml");

PackagePart part = oPCPackage.createPart(partName, "application/vnd.openxmlformats-officedocument.drawingml.chart+xml");

MyXSLFChart myXSLFChart = new MyXSLFChart(part);

MyXSLFChartShape myXSLFChartShape = new MyXSLFChartShape(slide, myXSLFChart);

return myXSLFChartShape;

}

public void drawPieChart(MyXSLFChartShape myXSLFChartShape) {

XSSFWorkbook workbook = myXSLFChartShape.getMyXSLFChart().getXSLFXSSFWorkbook().getXSSFWorkbook();

XSSFSheet sheet = workbook.getSheetAt(0);

sheet.createRow(0).createCell(0).setCellValue("Cat");

sheet.getRow(0).createCell(1).setCellValue("Val");

for (int r = 1; r < 4; r++) {

sheet.createRow(r).createCell(0).setCellValue("Cat" + r);

sheet.getRow(r).createCell(1).setCellValue(10*r);

}

CTChartSpace chartSpace = myXSLFChartShape.getMyXSLFChart().getChartSpace();

CTPieChart cTPieChart = chartSpace.addNewChart().addNewPlotArea().addNewPieChart();

cTPieChart.addNewVaryColors().setVal(true);

CTPieSer cTPieSer = cTPieChart.addNewSer();

cTPieSer.addNewIdx().setVal(0);

CTStrRef cTStrRef = cTPieSer.addNewTx().addNewStrRef();

cTStrRef.setF("Sheet0!$B$1");

cTStrRef.addNewStrCache().addNewPtCount().setVal(1);

CTStrVal cTStrVal = cTStrRef.getStrCache().addNewPt();

cTStrVal.setIdx(0);

cTStrVal.setV("Val");

cTStrRef = cTPieSer.addNewCat().addNewStrRef();

cTStrRef.setF("Sheet0!$A$2:$A$4");

cTStrRef.addNewStrCache().addNewPtCount().setVal(3);

for (int r = 1; r < 4; r++) {

cTStrVal = cTStrRef.getStrCache().addNewPt();

cTStrVal.setIdx(r-1);

cTStrVal.setV("Cat" + r);

}

CTNumRef cTNumRef = cTPieSer.addNewVal().addNewNumRef();

cTNumRef.setF("Sheet0!$B$2:$B$4");

cTNumRef.addNewNumCache().addNewPtCount().setVal(3);

for (int r = 1; r < 4; r++) {

CTNumVal cTNumVal = cTNumRef.getNumCache().addNewPt();

cTNumVal.setIdx(r-1);

cTNumVal.setV("" + (10*r));

}

}

public void drawBarChart(MyXSLFChartShape myXSLFChartShape) {

XSSFWorkbook workbook = myXSLFChartShape.getMyXSLFChart().getXSLFXSSFWorkbook().getXSSFWorkbook();

XSSFSheet sheet = workbook.getSheetAt(0);

sheet.createRow(0);

for (int c = 1; c < 4; c++) {

sheet.getRow(0).createCell(c).setCellValue("Cat" + c);

}

for (int r = 1; r < 5; r++) {

sheet.createRow(r).createCell(0).setCellValue("Val" + r);

for (int c = 1; c < 4; c++) {

sheet.getRow(r).createCell(c).setCellValue((10+r)*c);

}

}

CTChartSpace chartSpace = myXSLFChartShape.getMyXSLFChart().getChartSpace();

CTChart cTChart = chartSpace.addNewChart();

CTPlotArea cTPlotArea = cTChart.addNewPlotArea();

CTBarChart cTBarChart = cTPlotArea.addNewBarChart();

cTBarChart.addNewVaryColors().setVal(true);

cTBarChart.addNewBarDir().setVal(STBarDir.COL);

for (int r = 1; r < 5; r++) {

CTBarSer cTBarSer = cTBarChart.addNewSer();

CTStrRef cTStrRef = cTBarSer.addNewTx().addNewStrRef();

cTStrRef.setF("Sheet0!$A$" + (r+1));

cTStrRef.addNewStrCache().addNewPtCount().setVal(1);

CTStrVal cTStrVal = cTStrRef.getStrCache().addNewPt();

cTStrVal.setIdx(0);

cTStrVal.setV("Val" + r);

cTBarSer.addNewIdx().setVal(r-1);

CTAxDataSource cttAxDataSource = cTBarSer.addNewCat();

cTStrRef = cttAxDataSource.addNewStrRef();

cTStrRef.setF("Sheet0!$B$1:$D$1");

cTStrRef.addNewStrCache().addNewPtCount().setVal(3);

for (int c = 1; c < 4; c++) {

cTStrVal = cTStrRef.getStrCache().addNewPt();

cTStrVal.setIdx(c-1);

cTStrVal.setV("Cat" + c);

}

CTNumDataSource ctNumDataSource = cTBarSer.addNewVal();

CTNumRef cTNumRef = ctNumDataSource.addNewNumRef();

cTNumRef.setF("Sheet0!$B$" + (r+1) + ":$D$" + (r+1));

cTNumRef.addNewNumCache().addNewPtCount().setVal(3);

for (int c = 1; c < 4; c++) {

CTNumVal cTNumVal = cTNumRef.getNumCache().addNewPt();

cTNumVal.setIdx(c-1);

cTNumVal.setV("" + ((10+r)*c));

}

}

//telling the BarChart that it has axes and giving them Ids

cTBarChart.addNewAxId().setVal(123456);

cTBarChart.addNewAxId().setVal(123457);

//cat axis

CTCatAx cTCatAx = cTPlotArea.addNewCatAx();

cTCatAx.addNewAxId().setVal(123456); //id of the cat axis

CTScaling cTScaling = cTCatAx.addNewScaling();

cTScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);

cTCatAx.addNewDelete().setVal(false);

cTCatAx.addNewAxPos().setVal(STAxPos.B);

cTCatAx.addNewCrossAx().setVal(123457); //id of the val axis

cTCatAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

//val axis

CTValAx cTValAx = cTPlotArea.addNewValAx();

cTValAx.addNewAxId().setVal(123457); //id of the val axis

cTScaling = cTValAx.addNewScaling();

cTScaling.addNewOrientation().setVal(STOrientation.MIN_MAX);

cTValAx.addNewDelete().setVal(false);

cTValAx.addNewAxPos().setVal(STAxPos.L);

cTValAx.addNewCrossAx().setVal(123456); //id of the cat axis

cTValAx.addNewTickLblPos().setVal(STTickLblPos.NEXT_TO);

//legend

CTLegend cTLegend = cTChart.addNewLegend();

cTLegend.addNewLegendPos().setVal(STLegendPos.B);

cTLegend.addNewOverlay().setVal(false);

}

public static void main(String[] args) throws Exception {

CreatePPTXChartsXSSFWb createPPTXCharts = new CreatePPTXChartsXSSFWb();

}

//a class for providing a MyXSLFChartShape

private class MyXSLFChartShape {

private CTGraphicalObjectFrame _graphicalObjectFrame;

private XSLFSlide slide;

private MyXSLFChart myXSLFChart;

MyXSLFChartShape(XSLFSlide slide, MyXSLFChart myXSLFChart) throws Exception {

String rId = "rId" + (slide.getRelationParts().size()+1);

slide.addRelation(rId, XSLFRelation.CHART, myXSLFChart);

long cNvPrId = 1;

String cNvPrName = "MyChart";

int cNvPrNameCount = 1;

for (CTGraphicalObjectFrame currGraphicalObjectFrame : slide.getXmlObject().getCSld().getSpTree().getGraphicFrameList()) {

if (currGraphicalObjectFrame.getNvGraphicFramePr() != null) {

if (currGraphicalObjectFrame.getNvGraphicFramePr().getCNvPr() != null) {

cNvPrId++;

if (currGraphicalObjectFrame.getNvGraphicFramePr().getCNvPr().getName().startsWith(cNvPrName)) {

cNvPrNameCount++;

}

}

}

}

CTGraphicalObjectFrame graphicalObjectFrame = slide.getXmlObject().getCSld().getSpTree().addNewGraphicFrame();

CTGraphicalObjectFrameNonVisual cTGraphicalObjectFrameNonVisual = graphicalObjectFrame.addNewNvGraphicFramePr();

cTGraphicalObjectFrameNonVisual.addNewCNvGraphicFramePr();

cTGraphicalObjectFrameNonVisual.addNewNvPr();

CTNonVisualDrawingProps cTNonVisualDrawingProps = cTGraphicalObjectFrameNonVisual.addNewCNvPr();

cTNonVisualDrawingProps.setId(cNvPrId);

cTNonVisualDrawingProps.setName("MyChart" + cNvPrNameCount);

CTGraphicalObject graphicalObject = graphicalObjectFrame.addNewGraphic();

CTGraphicalObjectData graphicalObjectData = CTGraphicalObjectData.Factory.parse(

"<c:chart xmlns:c=\"http://schemas.openxmlformats.org/drawingml/2006/chart\" "

+"xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\" "

+"r:id=\"" + rId + "\"/>"

);

graphicalObjectData.setUri("http://schemas.openxmlformats.org/drawingml/2006/chart");

graphicalObject.setGraphicData(graphicalObjectData);

_graphicalObjectFrame = graphicalObjectFrame;

this.slide = slide;

this.myXSLFChart = myXSLFChart;

this.setAnchor(new Rectangle());

}

private void setAnchor(Rectangle2D anchor) {

CTTransform2D xfrm = (_graphicalObjectFrame.getXfrm() != null) ? _graphicalObjectFrame.getXfrm() : _graphicalObjectFrame.addNewXfrm();

CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();

long x = Units.toEMU(anchor.getX());

long y = Units.toEMU(anchor.getY());

off.setX(x);

off.setY(y);

CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm.addNewExt();

long cx = Units.toEMU(anchor.getWidth());

long cy = Units.toEMU(anchor.getHeight());

ext.setCx(cx);

ext.setCy(cy);

}

private MyXSLFChart getMyXSLFChart() {

return myXSLFChart;

}

}

//a wrapper class for the ChartSpaceDocument /ppt/charts/chart*.xml in the *.pptx ZIP archive

private class MyXSLFChart extends POIXMLDocumentPart {

private CTChartSpace chartSpace;

private MyXSLFXSSFWorkbook myXSLFXSSFWorkbook;

private MyXSLFChart(PackagePart part) throws Exception {

super(part);

OPCPackage oPCPackage = part.getPackage();

int chartCount = oPCPackage.getPartsByName(Pattern.compile("/ppt/embeddings/.*.xlsx")).size() + 1;

PackagePartName partName = PackagingURIHelper.createPartName("/ppt/embeddings/Microsoft_Excel_Worksheet" + chartCount + ".xlsx");

PackagePart xlsxpart = oPCPackage.createPart(partName, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

myXSLFXSSFWorkbook = new MyXSLFXSSFWorkbook(xlsxpart);

String rId = "rId" + (this.getRelationParts().size()+1);

XSLFXSSFRelation xSLFXSSFRelationPACKAGE = new XSLFXSSFRelation(

"http://schemas.openxmlformats.org/officeDocument/2006/relationships/package");

this.addRelation(rId, xSLFXSSFRelationPACKAGE, myXSLFXSSFWorkbook);

chartSpace = ChartSpaceDocument.Factory.newInstance().addNewChartSpace();

CTExternalData cTExternalData = chartSpace.addNewExternalData();

cTExternalData.setId(rId);

//cTExternalData.addNewAutoUpdate().setVal(true);

}

private CTChartSpace getChartSpace() {

return chartSpace;

}

private MyXSLFXSSFWorkbook getXSLFXSSFWorkbook() {

return myXSLFXSSFWorkbook;

}

@Override

protected void commit() throws IOException {

XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);

xmlOptions.setSaveSyntheticDocumentElement(new QName(CTChartSpace.type.getName().getNamespaceURI(), "chartSpace", "c"));

PackagePart part = getPackagePart();

OutputStream out = part.getOutputStream();

chartSpace.save(out, xmlOptions);

out.close();

}

}

//a wrapper class for the XSSFWorkbook /ppt/embeddings/Microsoft_Excel_Worksheet*.xlsx in the *.pptx ZIP archive

private class MyXSLFXSSFWorkbook extends POIXMLDocumentPart {

private XSSFWorkbook workbook;

private MyXSLFXSSFWorkbook(PackagePart part) throws Exception {

super(part);

workbook = new XSSFWorkbook();

XSSFSheet sheet = workbook.createSheet();

}

private XSSFWorkbook getXSSFWorkbook() {

return workbook;

}

@Override

protected void commit() throws IOException {

PackagePart part = getPackagePart();

OutputStream out = part.getOutputStream();

workbook.write(out);

workbook.close();

out.close();

}

}

//a class to note the relations

private class XSLFXSSFRelation extends POIXMLRelation {

private XSLFXSSFRelation(String rel) {

super(null, rel, null);

}

}

}


Edit January 29 2019:

Above code was working using apache poi 3.16 up to apache poi 3.17. To

make it work using current apache poi 4.0.1 the only need is changing the

imports a little bit:

...

import org.apache.poi.openxml4j.opc.*;

//import static org.apache.poi.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;

import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;

import org.apache.poi.ooxml.*;

import org.apache.xmlbeans.*;

...

This is because the Office Open XML stuff now is in

org.apache.poi.ooxml.*and not more in org.apache.poi.*.

以上是 Java使用APACHE POI在PowerPoint中创建图表 的全部内容, 来源链接: utcz.com/qa/400508.html

回到顶部