Java根据模板导出PPT

3 篇文章 0 订阅
3 篇文章 0 订阅

如何导出PPT

Java生成或者导出PPT的问题,都可以归为一类问题:根据模板导出PPT。毕竟这样做,比直接生成PPT要简单。因为工作中,遇到了要生成PPT的需求,所以做了一个根据模板PPT,生成目标PPT的例子,希望可以帮助大家。根据模板导出PPT,大体上可以分为三步:

  1. 制作PPT模板
  2. 替换模板中的文字、图片等内容
  3. 将替换完成之后的内容,生成新的PPT文件

制作PPT模板

以下是我制作的模板例子,要替换的文本,要用文本框占位,内容我先写上了对应的英文(占位的内容可以是中文,也可以是英文,只是我习惯用英文,便于区别),之后便可以根据对应的英文,替换为目标文字。如果图片是动态的,要用别的图片先占位,比如位置、尺寸大小,这样目标图片就可以替换到指定的位置。
第一页:
在这里插入图片描述

第二页:
在这里插入图片描述

第三页:
在这里插入图片描述

替换模板内容

这个在关键步骤写了注释,大家应该能看懂的,实际中,可以根据情况修改,毕竟不可能一直switch匹配,太难看,可以用map做映射关系,拿到目标文本,也可以用反射取到目标文本。

引入poi依赖

        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.2</version>
        </dependency>

读取模板文件

        // 读取模板文件
       ClassPathResource resource = new ClassPathResource("templates/test.pptx");
         // 根据模板,创建一个新的ppt文档
        XMLSlideShow ppt = new XMLSlideShow(resource.getInputStream());

替换模板内容

        // 得到每页ppt
        List<XSLFSlide> slides = ppt.getSlides();
        // 遍历ppt,填充模板
        for (int i = 0; i < slides.size(); i++) {
            // 遍历每页ppt中待填充的形状组件
            for (XSLFShape shape : slides.get(i).getShapes()) {
                if (shape instanceof TextShape){
                    // 替换文本
                    TextShape textShape = (TextShape) shape;
                    TextRun textRun;
                    String text = textShape.getText();
                    switch (text){
                        case "username":
                            textRun = textShape.setText("张三");
                            textRun.setFontFamily("宋体(正文)");
                            textRun.setFontSize(18.0);
                            break;
                        case "reportDate":
                            textRun = textShape.setText("2022-10-30");
                            textRun.setFontFamily("宋体(正文)");
                            textRun.setFontSize(18.0);
                            break;
                        case "completedCnt":
                            textRun = textShape.setText("16");
                            textRun.setFontFamily("宋体(正文)");
                            textRun.setFontSize(18.0);
                            textRun.setFontColor(Color.green);
                            break;
                        case "UnCompletedCnt":
                            textRun = textShape.setText("23");
                            textRun.setFontFamily("宋体(正文)");
                            textRun.setFontSize(18.0);
                            textRun.setFontColor(Color.red);
                            break;
                        case "planDate":
                            textRun = textShape.setText("2022-11-25");
                            textRun.setFontFamily("宋体(正文)");
                            textRun.setFontSize(18.0);
                            textRun.setFontColor(Color.blue);
                            break;
                    }
                }else if (shape instanceof PictureShape){
                    // 替换图片
                    PictureData pictureData = ((PictureShape) shape).getPictureData();
                    pictureData.setData(FileUtils.readFileToByteArray(new File("D:\\images\\"+i+".jpg")));
                }
            }
        }

生成新的PPT

        // 将新的ppt写入到指定的文件中
        FileOutputStream outputStream = new FileOutputStream(targetPath);
        ppt.write(outputStream);
        outputStream.close();

导出的PPT

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

参考链接:Apache POI PPT - 概述_w3cschool

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值