poi 操作 PPT,针对 PPTX--图表篇

接下来对 ppt 内的图表进行操作,替换图表的数据

poi 操作 PPT,针对 PPTX--图表篇-LMLPHP

1、读取 PPT 模板


String filePath = "C:\\Users\\HONOR\\Desktop\\xsmb.pptx";
String exportPath = "C:\\Users\\HONOR\\Desktop\\a.pptx";


// 读取 ppt 模板
PPTUtil pptUtil = new PPTUtil(filePath);

2、替换标题


@Test
public void testDemo() {
    // 读取 ppt
    PPTUtil pptUtil = new PPTUtil(filePath);

    // 获取第二页幻灯片中的第一个图表,该幻灯片中只有一个图表
    XSLFChart chart = pptUtil.getChartFromSlide(pptUtil.getSlides().get(1));

    // 获取标题
    XSLFTextShape titleShape = chart.getTitleShape();

    // 打印该图表的标题
    System.out.println(titleShape.getText());

    // 重新设置图表标题
    XSLFTextParagraph textParagraph = pptUtil.setChartTitle(titleShape, false);
    pptUtil.addParagraphText(textParagraph, false, "销售统计表1-修改标题后", true, "微软雅黑", "微软雅黑", "18");

    // 写入到新的文件
    pptUtil.writePPT(exportPath);
}

输出:


销售统计表1

设置后效果
poi 操作 PPT,针对 PPTX--图表篇-LMLPHP

4、替换图表数据


@Test
public void testDemo() {
    PPTUtil pptUtil = new PPTUtil(filePath);

    // 从第二张幻灯片中获取第一个图表
    XSLFChart chart = pptUtil.getChartFromSlide(pptUtil.getSlides().get(1));

    // 存放数据
    List<List<String>> data = new ArrayList<List<String>>();
    List<String> tempData1 = new ArrayList<String>();
    List<String> tempData2 = new ArrayList<String>();
    // 构造数据
    for (int i = 0; i < 11; i++) {
        tempData1.add("标签" + (i + 1));
        tempData2.add((i + 1) + "");
    }
    data.add(tempData1);
    data.add(tempData2);

    // 替换第一个柱状图的数据
    pptUtil.updateBarCat(pptUtil.getBarChartFromChart(chart).get(0), 0, data);  // 替换 cat
    pptUtil.updateBarDataCache(pptUtil.getBarChartFromChart(chart).get(0), 0, tempData2);   // 替换数据缓存

    // 替换第二个柱状图的数据
    pptUtil.updateBarCat(pptUtil.getBarChartFromChart(chart).get(0), 1, data);  // 替换 cat
    pptUtil.updateBarDataCache(pptUtil.getBarChartFromChart(chart).get(0), 1, tempData2);   // 替换数据缓存

    // 替换第一个折线图的数据
    pptUtil.updateLineCat(pptUtil.getLineChartFromChart(chart).get(0), 0, data);    // 替换 cat
    pptUtil.updateLineDataCache(pptUtil.getLineChartFromChart(chart).get(0), 0, tempData2); // 替换数据缓存

    // 替换第二个折线图的数据
    pptUtil.updateLineCat(pptUtil.getLineChartFromChart(chart).get(0), 1, data);    // 替换 cat
    pptUtil.updateLineDataCache(pptUtil.getLineChartFromChart(chart).get(0), 1, tempData2); // 替换数据缓存


    pptUtil.writePPT(exportPath);
}

替换后效果
poi 操作 PPT,针对 PPTX--图表篇-LMLPHP

这里强调一下,如下图,因为两个柱状图是属于同一个y轴的,所以 pptUtil.getBarChartFromChart(chart).get(0) 方法就能获取到两个柱状图,只是这两个柱状图是属于同一个柱状图 barChart 里面的不同 serials(系列) 里面。
poi 操作 PPT,针对 PPTX--图表篇-LMLPHP

:如果两个柱状图属于两个不同的轴,那么这两个柱状图就在两个不同的 barChart 里面。

PPTUtil 工具地址:https://gitee.com/livekeys/officetool.git
(目前只支持更新饼图,折线图,柱状图,雷达图,使用方法后续继续更新),有问题请联系我。

04-22 14:00