如何导出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());
替换模板内容
// 得到每页pptList<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