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

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

项目需求

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

模板文件如下

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

实现过程

1.引入第三方依赖

<dependency>
     <groupId>org.apache.poi</groupId>
     <artifactId>poi-ooxml</artifactId>
     <version>3.15</version>
</dependency>

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<WeekAnalyseModel> lists, String rankType) throws IOException {
        //List<WeekAnalyseModel>是我们项目自己定义的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;

/**
 * <p>PowerPoint文件工具基类
 * <p>
 * <p>通用的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<WeekAnalyseModel>是我们项目自己定义的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的详细内容,更多关于Java的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java 给PPT添加动画效果的示例

    PPT幻灯片中对形状可设置动画效果,常见的动画效果为内置的固定类型,即动画效果和路径是预先设定好的固定模板,但在设计动画效果时,用户也可以按照自己的喜好自定义动画动作路径.下面,通过Java后端程序代码来展示如何给PPT添加动画效果.包括预设动画以及自定动画效果的方法. 本次测试环境包括: 目标测试文档:Power Point 2013 编译环境:IntelliJ IDEA 2018 JDK版本:1.8.0 PPT库版本:spire.presentation.jar 4.3.2 注:在通过该PP

  • 浅谈Java设置PPT幻灯片背景——纯色、渐变、图片背景

    PPT幻灯片生成时,系统默认是无色背景填充,幻灯片设计需要手动设置背景效果,可设置颜色填充或者图片背景填充.本文将对此介绍具体实现方法. Jar文件导入方法(参考): 步骤1:在Java程序中可新建一个文件夹命名为Lib,并将下载包中的jar文件复制到新建的文件夹下. 步骤2:复制文件后,添加到引用类库:选中这个jar文件,点击鼠标右键,选择"Build Path" – "Add to Build Path".完成引用. Java示例1:设置背景颜色 1.纯色背景

  • Java实现将html字符串插入到PPT幻灯片

    目录 一. 环境配置 二.代码示例 三.效果图 通过Java后端代码操作PPT幻灯片时,可直接在幻灯片中绘制形状,并在形状中添加文本字符串内容.本篇文章,介绍一种通过html字符串来添加内容到PPT幻灯片的的方法,可添加文字.图片.视频.音频等.下面是具体方法和步骤. 一. 环境配置 IntelliJ IDEA Free Spire.Presentation for Java 关于如何导入jar: 1.Maven仓库下载导入.参考如下配置内容: <repositories> <repos

  • java实现PPT转化为PDF

    JACOB的方法,足可以解决这个问题,但是我既然以前曾经做过报表,就想尝试不同的方法. JACOB是一座连接JAVA和微软的桥,所有的解析由微软解析.POI是没有微软解析的那么原汁原味的,所以如果要求高的话,还是使用JACOB. 大致思路很简单,将PPT先转化为图片,然后将图片写入PDF.转化图片是用POI,操作PDF使用ITEX.不过这个方法的BUG就是转化图片的POI效果不是很好. 导入的包分别是:itextpdf-5.1.3.jar,poi-3.8-20120326.jar,poi-scr

  • Java如何在PPT中绘制图形

    Microsoft PowerPoint可支持在幻灯片中插入各种类型的图形并且可设置图形填充.线条颜色.图形大小.位置等.下面将通过Java编程来演示在PPT中绘制图形的方法. 工具:Free Spire.Presentation for Java Jar文件导入方法1:通过官网下载. Step1:在程序中新建一个Directory目录并命名为lib:并将控件包中的Spire.Presentation.jar(可在解压控件包下的lib文件中获取)直接复制该目录下. Step2: 选中复制后的Sp

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

    目录 项目需求 模板文件如下 实现过程 1.引入第三方依赖 2.编写业务代码 3.根据模板生成新的PPT 项目需求 最近项目中有一个需求就是让Java代码去代替人工操作,自动生成PPT,具体就是查询数据库数据,然后根据模板文件(PPT),将数据库数据与模板文件(PPT),进行组合一下.生成新的PPT文件. 模板文件如下 将模板文件中的姓名,进步率,连续进步次数,图片.替换为具体的人员信息. 实现过程 1.引入第三方依赖 <dependency> <groupId>org.apach

  • Java通过Freemarker模板实现生成Word文件

    目录 1.  准备模板 2.  代码实现 3. PDF文件加水印 1.  准备模板 模板 + 数据 = 模型 1.将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2.将.xml文件重命名为.ftl文件 3.用文本编辑器打开.ftl文件,将内容复制出来,格式化一下,再覆盖原来的内容 (PS:格式化一下是为了方便查找并设置变量/占位符,当然设置好模板参数变量以后可以再压缩后再写会.ftl文件) 另外,强烈不建议在word文件中去编辑设置模

  • js实现瀑布流效果(自动生成新的内容)

    当滚动条接近底部会自动生成新的内容(色块) 效果图: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{list-style: none;} div{overflow: hidden;} ul{float: left;} li{widt

  • C#实现保存文件时重名自动生成新文件的方法

    本文实例讲述了C#实现保存文件时重名自动生成新文件的方法.分享给大家供大家参考.具体如下: 将一个文档保存为 a.txt 时,发现此文件已经存在,则自动保存为 a(1).txt /// <summary> /// Generates a new path for duplicate filenames. /// </summary> /// <param name="path">The path.</param> /// <retu

  • Java反射 JavaBean对象自动生成插入,更新,删除,查询sql语句操作

    通过反射根据提供的表名.POJO类型.数据对象自动生成sql语句. 如名为 User 的JavaBean与名为 user 的数据库表对应,可以提供一个封装有数据的User对象user,根据user中含有的数据自动生成sql语句. 1.生成插入语句(插入user中包含的非空数据的语句): String insertSql = getInsertSql("user", User.class, user); 2.生成更新语句(user中id不能为空): String updateSql =

  • Java详细分析讲解自动装箱自动拆箱与Integer缓存的使用

    目录 1. 前言 2. 包装类 3. 自动装箱与自动拆箱 4. Interger缓存 5. 回答题目 1. 前言 自动装箱和自动拆箱是什么?Integer缓存是什么?它们之间有什么关系? 先来看一道题目. Integer a = new Integer(1); Integer b = new Integer(1); System.out.println(a==b); Integer c = 1; Integer d = 1; System.out.println(c==d); Integer e

  • python实现自动生成C++代码的代码生成器

    遇到的问题 工作中遇到这么一个事,需要写很多C++的底层数据库类,但这些类大同小异,无非是增删改查,如果人工来写代码,既费力又容易出错:而借用python的代码自动生成,可以轻松搞定: (类比JAVA中的Hibernate自动生成的数据库底层操作代码) 下面介绍使用python字符串替换的方法: Python字符串替换的几种方法 1. 字符串替换 将需要替换的内容使用格式化符替代,后续补上替换内容: template = "hello %s , your website is %s "

  • 一个JAVA小项目--Web应用自动生成Word

    前段时间接到一个Web应用自动生成Word的需求,现整理了下一些关键步骤拿来分享一下. 思路:(注:这里只针对WORD2003版本,其它版本大同小异.) 因为WORD文件内部的数据及格式等是通过XML文件的形式存储的,所以WORD文件可以很方便的实现由DOC到XML格式的相互转换,而操作XML文件就方便的多了,这样就实现了与平台无关的各种操作,通过节点的查询.替换.删除.新增等生成Word文件.所以,根据模板生成WORD文件实质就是由用户数据替换XML文件中特殊标签,然后另存为一个DOC文件的过

  • vue-cli3 项目优化之通过 node 自动生成组件模板 generate View、Component

    介绍 做前端的大家都知道通过 vue 开发的项目每次创建新组建的时候,都要新建一个目录,然后新增 .vue 文件,在这个文件中再写入 template . script . style 这些内容,虽然在写入的时候大家都有自己的自动补全共计,不过这些都是模板性的,每次都要这样重复操作,很麻烦有没有. 本文就是通过node来帮助我们,自动去执行这些重复操作,而我们只需要告诉控制台我们需要创建的组件名字就可以了. 本文自动创建的组件包含两个文件:入口文件 index.js .vue文件 main.vu

  • idea创建JAVA Class时自动生成头部文档注释的方法

    IDEA设置文档注释模板 创建Class文件时自动生成的头部注释如图 如何配置idea的头部注释格式,可以生成像之前的注释格式一样的文档注释? File->settings->Editor->File and Code Templates->Files->Class 原先模板 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end #parse(&

随机推荐