如何导出PPT
Java生成或者导出PPT的问题,都可以归为一类问题:根据模板导出PPT。毕竟这样做,比直接生成PPT要简单。因为工作中,遇到了要生成PPT的需求,所以做了一个根据模板PPT,生成目标PPT的例子,希望可以帮助大家。根据模板导出PPT,大体上可以分为三步:
- 制作PPT模板
- 替换模板中的文字、图片等内容
- 将替换完成之后的内容,生成新的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();