Java实现根据模板自动生成新的PPT

网友投稿 464 2022-08-26


Java实现根据模板自动生成新的PPT

目录项目需求模板文件如下实现过程1.引入第三方依赖2.编写业务代码3.根据模板生成新的PPT

项目需求

最近项目中有一个需求就是让java代码去代替人工操作,自动生成PPT,具体就是查询数据库数据,rTUONhPVl然后根据模板文件(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 = 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());

http:// 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://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的详细内容,更多关于Java的资料请关注我们其它相关文章!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅拷贝和深拷贝(浅拷贝和深拷贝的区别js常见笔试题)
下一篇:shutil 模块(拷贝和压缩)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~