2017-07-28 358 views
2

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

XSLFSlide slide = pptx.createSlide(); 
XSLFTextShape textShape = slide.createTextBox(); 
textShape.setText(data); 

的幻灯片对象犯规包含任何API来创建一个图表。

对此的任何解决方案?

在此先感谢

回答

7

有没有像在apache poi PowerPoint幻灯片中可使用的XSLFChartShape直到现在。

当然但是,如果一个人知道所述*.pptxZIP归档文件的内部结构和在其中XML,则有可能使用来自org.openxmlformats.schemas.drawingml.x2006.*org.openxmlformats.schemas.presentationml.x2006.*和所述apache poiOPCPackage类和低电平CT*类创建此从头。

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

这是一个草案只是为了显示方法。其产生相同的,但具有XSSFWorkbook S作为数据表

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(); 
    } 

} 

} 

代码。

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); 
    } 
} 
} 
+0

谢谢你!!这确实有用,并允许您从头开始创建图表。没有论坛有这样的工作代码。你也可以让我知道它是否可能在幻灯片中嵌入pdf。你有相同的参考吗? Thankyou再次 还有帮助我们了解pptx的低级结构的任何文档? – user3247376

+0

对于生成图表的上述代码,我无法在双击它时链接/编辑excel。 @Axel Richter关于如何将excel附加到图表数据的任何指针 – user3247376

+0

@ user3247376:代码仅为图表提供了缓存值。但是如果单击“编辑数据”,“PowerPoint 2016”以及“Libreoffice Impress”能够创建数据表。但是当然'PowerPoint 2007'不会这样做。但是提供嵌入式'XSSFWorkbook'作为数据表也是可能的。看我的补充。 –