目录
项目需求
模板文件如下:
实现过程:
1.引入第三方依赖
2.编写业务代码
3.根据模板生成新的PPT
项目需求 最近项目中有一个需求就是让Java代码去代替人工操作,自动生成PPT,具体就是查询数据库数据,然后根据模板文件(PPT),将数据库数据与模板文件(PPT),进行组合一下。生成新的PPT文件。
模板文件如下:
文章图片
文章图片
将模板文件中的姓名,进步率,连续进步次数,图片。替换为具体的人员信息。
实现过程:
1.引入第三方依赖
org.apache.poi
poi-ooxml
3.15
Apache POI是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”。
HSSF-提供读写MicrosoftExcelXLS格式档案的功能
XSSF-提供读写MicrosoftExcelOOXMLXLSX格式档案的功能
HWPF-提供读写MicrosoftWordDOC格式档案的功能
HSLF-提供读写MicrosoftPowerPoint格式档案的功能
HDGF-提供读MicrosoftVisio格式档案的功能
HPBF-提供读MicrosoftPublisher格式档案的功能
HSMF-提供读MicrosoftOutlook格式档案的功能
2.编写业务代码
import org.apache.poi.sl.usermodel.Shape;
import org.apache.poi.sl.usermodel.Slide;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import java.io.*;
import java.util.List;
/**
* 读取模板PPT生成新的PPT文件
*
* @author Promsing(张有博)
* @version 1.0.0
* @since 2022/2/11 - 15:37
*/
public class RenderPowerPointTemplate extends BasePowerPointFileUtil {/**
* 读取PPT模板
* @param powerPoint
* @param
* @throws IOException
*/
public static void renderPowerPointTemplateOfCertificate(InputStream powerPoint, List lists, String rankType) throws IOException {
//List是我们项目自己定义的model,可改成其他业务的model
if(powerPoint == null) {
return;
}
//创建一个幻灯片
XMLSlideShow slideShow = new XMLSlideShow(powerPoint);
//从幻灯片中获取每个页
List slides = slideShow.getSlides();
//遍历每一页PPT
for (int i = 0 ;
i < slides.size() ;
i++) {
//幻灯片布局,文本框,矩形框之类的,遍历一页PPT中的所有控件
List shapes = ((Slide)slides.get(i)).getShapes();
for (int j = 0 ;
j < shapes.size() ;
j++) {
Shape shape = (Shape) shapes.get(j);
RenderPowerPointTemplate.renderShapeAndPicture(shape, lists.get(i),rankType);
}
}//新PPT的位置,file就是新的PPT文件
File file=new File(rankType+"test.pptx");
OutputStream outputStreams = new FileOutputStream(file);
slideShow.write(outputStreams);
// FileUpLoadUtil.T_THREAD_LOCAL.set(file.getAbsolutePath());
System.out.println("新文件的路径:"+file.getAbsolutePath());
}
}
import com.tfjybj.integral.constant.CommonConstant;
import com.tfjybj.integral.model.WeekAnalyseModel;
import com.tfjybj.integral.utils.SimplifiedDate;
import org.apache.commons.io.FileUtils;
import org.apache.poi.sl.usermodel.Shape;
import org.apache.poi.sl.usermodel.*;
import org.apache.poi.xslf.usermodel.XSLFTextRun;
import org.apache.poi.xslf.usermodel.XSLFTextShape;
import java.awt.*;
import java.io.*;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* PowerPoint文件工具基类
* * 通用的PowerPoint文件工具基类,可用于从PowerPoint文档中抽取文本信息
*/
public class BasePowerPointFileUtil {/**
* 渲染、绘制文本框
*
* @param shape
* @param data
*/
public static void renderShapeAndPicture(Shape shape, WeekAnalyseModel data,String rankType) {
//判断是否是文本框
if (shape instanceof TextShape) {
BasePowerPointFileUtil.replace(shape, data,rankType);
} else if (shape instanceof GroupShape) {
Iterator groupShapes = ((GroupShape) shape).iterator();
while (groupShapes.hasNext()) {
Shape groupShape = (Shape) groupShapes.next();
BasePowerPointFileUtil.renderShapeAndPicture(groupShape, data,rankType);
}
} else if (shape instanceof TableShape) {
TableShape tableShape = ((TableShape) shape);
int column = tableShape.getNumberOfColumns();
int row = tableShape.getNumberOfRows();
for (int r = 0;
r < row;
r++) {
for (int c = 0;
c < column;
c++) {
BasePowerPointFileUtil.replace(tableShape.getCell(r, c), data,rankType);
}
}
} else if (shape instanceof PictureShape) {
//判断是否是图片框
PictureShape pictureShape = (PictureShape) shape;
PictureData pictureData = https://www.it610.com/article/pictureShape.getPictureData();
byte[] bytes = BufferStreamForByte(URLToFile(data.getPictureURL()), 1024);
try {
pictureData.setData(bytes);
} catch (IOException e) {
e.printStackTrace();
}
}}/**
* 替换模板PPT中的值
*
* @param shape
* @param weekAnalyseModel
*/
public static void replace(Shape shape, WeekAnalyseModel weekAnalyseModel,String rankType) {
//List是我们项目自己定义的model,可改成其他业务的model
if (shape instanceof TextShape) {String replaceText = ((XSLFTextShape) shape).getText();
XSLFTextRun xslfTextRun = null;
//替换数据的业务逻辑,待优化
switch (replaceText) {
case "姓名:闪耀姓名1":
xslfTextRun = ((XSLFTextShape) shape).setText("姓名:" + weekAnalyseModel.getUserName());
break;
case "积分:闪耀分数1":
xslfTextRun = ((XSLFTextShape) shape).setText("积分:" + weekAnalyseModel.getWeekData());
break;
case "闪耀1连击ヾ":
xslfTextRun = ((XSLFTextShape) shape).setText("闪耀" + weekAnalyseModel.getListNumber() + "连击ヾ");
break;
case "姓名:闪耀姓名2":
xslfTextRun = ((XSLFTextShape) shape).setText("姓名:" + weekAnalyseModel.getUserName());
break;
case "积分:闪耀分数2":
xslfTextRun = ((XSLFTextShape) shape).setText("积分:" + weekAnalyseModel.getWeekData());
break;
case "闪耀2连击ヾ":
xslfTextRun = ((XSLFTextShape) shape).setText("闪耀" + weekAnalyseModel.getListNumber() + "连击ヾ");
break;
}//空值过滤,设置样式
if (xslfTextRun != null) {
if (rankType.equals("闪耀之星")||rankType.equals("进步之星")){
setTextStyle(xslfTextRun);
}else if (rankType.equals("闪耀之星荣誉证书")||rankType.equals("进步之星荣誉证书")){
setTextStyleCertificate(xslfTextRun);
}
}
}
}/**
* 设置字体样式
*
* @param xslfTextRun
*/
private static void setTextStyle(XSLFTextRun xslfTextRun) {
xslfTextRun.setFontFamily("等线(正文)");
Color color = new Color(255, 255, 255);
xslfTextRun.setFontColor(color);
xslfTextRun.setFontSize(40.0);
xslfTextRun.setBold(true);
}/**
* 设置证书字体样式
*
* @param xslfTextRun
*/
private static void setTextStyleCertificate(XSLFTextRun xslfTextRun) {
xslfTextRun.setFontFamily("宋体");
Color color = new Color(0, 0, 0);
xslfTextRun.setFontColor(color);
xslfTextRun.setFontSize(32.0);
xslfTextRun.setBold(true);
}/**
* 将文件转为字节数组
* @param file
* @param size
* @return
*/
public static byte[] BufferStreamForByte(File file, int size) {
byte[] content = null;
try {
BufferedInputStream bis = null;
ByteArrayOutputStream out = null;
try {
FileInputStream input = new FileInputStream(file);
bis = new BufferedInputStream(input, size);
byte[] bytes = new byte[1024];
int len;
out = new ByteArrayOutputStream();
while ((len = bis.read(bytes)) > 0) {
out.write(bytes, 0, len);
}bis.close();
content = out.toByteArray();
} finally {
if (bis != null) {
bis.close();
}
if (out != null) {
out.close();
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return content;
}/**
* 读取网络中的图片
* @param url https://www.kziyue.com/wp-content/uploads/2019/06/5bca-hxyuaph9825616.jpg
* @return
*/
public static File URLToFile(String url){
File file1 = new File("test.mp4");
try {URL url1 = new URL(url);
FileUtils.copyURLToFile(url1,file1);
} catch (IOException e) {
e.printStackTrace();
}
File absoluteFile = file1.getAbsoluteFile();
return file1;
}}
3.根据模板生成新的PPT
文章图片
如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。【#|Java 根据模板文件生成新的PPT】
推荐阅读
- #|SpringBoot集成Elasticseach
- java|云原生解决什么问题()
- Golang|Golang 小数操作之判断几位小数点与四舍五入
- Golang|Golang []int []string 互转与判断字符是否在数组中
- 博文视点IT荐书吧|迈向云原生(名企FreeWheel应用架构演进)
- Docker|Docker【2】 | 大白话带你快速安装Docker,不懂你捶我
- #|Helm包管理系统的基本概念与应用(一)
- Springcloud笔记|SpringCloud 基础学习笔记
- 程序员|作为Java开发程序员,MySQL千万数据量深分页优化