Java generates a new PPT based on the template file

content

Project requirements

The template file is as follows:

Implementation process:

1. Introduce third-party dependencies

2. Write business code

3. Generate a new PPT according to the template


Project requirements

In recent projects, there is a need to let Java code replace manual operation and automatically generate PPT, specifically, query database data, and then combine database data and template file (PPT) according to template file (PPT). Generate a new PPT file.

The template file is as follows:

Put the name, progress rate, continuous progress times , and pictures in the template file . Replace with specific person information .

Implementation process:

1. Introduce third-party dependencies

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

Apache POI is a free and open source cross-platform Java API written in Java. Apache POI provides APIs for Java programs to read and write Microsoft Office format files. POI is an acronym for "Poor Obfuscation Implementation", which means "Concise Obfuscation Implementation".

HSSF-提供读写MicrosoftExcelXLS格式档案的功能
XSSF-提供读写MicrosoftExcelOOXMLXLSX格式档案的功能
HWPF-提供读写MicrosoftWordDOC格式档案的功能
HSLF-提供读写MicrosoftPowerPoint格式档案的功能
HDGF-提供读MicrosoftVisio格式档案的功能
HPBF-提供读MicrosoftPublisher格式档案的功能
HSMF-提供读MicrosoftOutlook格式档案的功能

2. Write business code


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. Generate a new PPT according to the template

If this blog is helpful to you, please remember to leave a message + like + favorite . 

Guess you like

Origin blog.csdn.net/promsing/article/details/122876796