Java 根据模板文件生成新的PPT

目录

项目需求

模板文件如下:

实现过程:

1.引入第三方依赖

2.编写业务代码

3.根据模板生成新的PPT


项目需求

最近项目中有一个需求就是让Java代码去代替人工操作,自动生成PPT,具体就是查询数据库数据,然后根据模板文件(PPT),将数据库数据与模板文件(PPT),进行组合一下。生成新的PPT文件。

模板文件如下:

Java 根据模板文件生成新的PPT_第1张图片

Java 根据模板文件生成新的PPT_第2张图片

将模板文件中的姓名,进步率,连续进步次数图片。替换为具体的人员信息

实现过程:

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()); 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_第3张图片

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。 

你可能感兴趣的:(#,项目实战,java,开发语言,后端)