java使用poi根据PPT模板替换文字,表格,图片生成新的PPT

java 复制代码
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.sl.usermodel.PictureData;
import org.apache.poi.sl.usermodel.PictureShape;
import org.apache.poi.sl.usermodel.TextParagraph;
import org.apache.poi.xslf.usermodel.*;
import org.openxmlformats.schemas.drawingml.x2006.main.CTTable;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class PPTGenerator {

    public static void main(String[] args) {
        try {
            String templatePath = "C:\\Users\\Lenovo\\Desktop\\333.pptx";
            String outputPath = "C:\\Users\\Lenovo\\Desktop\\222.pptx";
            XMLSlideShow ppt = new XMLSlideShow(new FileInputStream(templatePath));
            Map<String, String> textMap = new HashMap<String, String>();
            textMap.put("text1", "上周,全国统调电厂日均供煤752万吨,日均耗煤713万吨,当前库存22901万吨,达到去年极值的109%,可用32天,同比增加2天。");
            textMap.put("text2", "国网统调电厂日均供煤663万吨,日均耗煤633万吨,当前库存19521万吨,达到去年极值的107%,可用31天,同比增加2天。四川电煤库存上升至567万吨,完成度冬储煤目标。");

            List<List<String>> tableList = new LinkedList<List<String>>();
            List<String> rowList = new LinkedList<String>();
            rowList.add("湖北");
            rowList.add("623");
            rowList.add("618");
            rowList.add("0.93%");
            rowList.add("35");
            tableList.add(rowList);
            tableList.add(rowList);

            List<String> imageList = new LinkedList<>();
            imageList.add("C:\\Users\\Lenovo\\Desktop\\图片1.jpg");

            int imageNum = 0;//;图片是按顺序替换
            for (XSLFSlide slide : ppt.getSlides()) {
                for (XSLFShape shape : slide.getShapes()) {
                    if (shape instanceof XSLFTextShape) {
                        XSLFTextShape textShape = (XSLFTextShape) shape;
                        List<XSLFTextParagraph> paragraphs = textShape.getTextParagraphs();
                        for (XSLFTextParagraph paragraph : paragraphs) {
                            List<XSLFTextRun> runs = paragraph.getTextRuns();
                            for (XSLFTextRun run : runs) {
                                String textToReplace = run.getRawText();
                                String textValue = textMap.get(textToReplace);
                                if (StringUtils.isBlank(textValue)){
                                    continue;
                                }
                                textToReplace = textToReplace.replace(textToReplace, textValue);
                                run.setText(textToReplace);
                            }
                        }
                    } else if (shape instanceof XSLFTable) {// 检查形状是否是表格
                        XSLFTable table = (XSLFTable) shape;
                        List<XSLFTableRow> rows = table.getRows();
                        for (int i = 0; i < tableList.size(); i++) {
                            XSLFTableRow row = table.getRows().get(i+1);
                            for (int j = 0; j < tableList.get(i).size(); j++) {
                                XSLFTableCell cell = row.getCells().get(j);
                                cell.clearText();
//                                cell.setText(tableList.get(i).get(j));
                                XSLFTextParagraph paragraph = cell.addNewTextParagraph();
                                paragraph.setTextAlign(TextParagraph.TextAlign.CENTER);

                                XSLFTextRun run = paragraph.addNewTextRun();
                                run.setText(tableList.get(i).get(j));
                                // 设置字体样式
                                run.setFontFamily("黑体"); // 设置字体名称
                                run.setFontSize(9.0); // 设置字体大小
//                                run.setBold(true); // 设置加粗
//                                run.setItalic(true); // 设置斜体
                                // 如果需要设置字体颜色,可以使用以下代码(这里使用RGB颜色)
//                                run.setFontColor(new java.awt.Color(255, 0, 0)); // 红色字体
                            }
                        }
                        //删除多余的预留空白行
                        while (tableList.size()+1<rows.size()){
                            table.removeRow(tableList.size()+1);
                        }
                    } else if (shape instanceof XSLFPictureShape) {// 检查形状是否是图片
                        byte[] imageData = Files.readAllBytes(Paths.get(imageList.get(imageNum)));
                        PictureData pictureData = ((PictureShape) shape).getPictureData();
                        pictureData.setData(imageData);
                        imageNum++;
                    }
                }
            }
            FileOutputStream out = new FileOutputStream(outputPath);
            ppt.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("PPT generated successfully!");
    }
}

maven依赖

java 复制代码
<dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>5.2.3</version> <!-- 请使用最新版本 -->
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-collections4</artifactId>
                <version>4.4</version>
            </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version> <!-- 选择一个合适的版本 -->
        </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>4.1.2</version>
            </dependency>
            <dependency>
                <groupId>org.apache.xmlbeans</groupId>
                <artifactId>xmlbeans</artifactId>
                <version>5.1.1</version>
            </dependency>
相关推荐
明天不吃。4 分钟前
【JMM】Java 内存模型
java·开发语言
成为大佬先秃头7 分钟前
Springboot整合Shiro使用yml文件管理Urls
java·spring boot·后端·shiro
鹿屿二向箔8 分钟前
基于Spring Boot的紧急物资管理系统
java·spring boot·后端
Jackson@ML16 分钟前
2025最新版Python 3.13.1安装使用指南
开发语言·python
山山而川粤23 分钟前
共享充电宝系统|Java|SSM|VUE| 前后端分离
java·开发语言·后端·学习·mysql
努力的小玖心41 分钟前
Java将String类型的html文本中的img路径替换前缀
java·前端·html
深蓝海拓1 小时前
PySide6的样式表
python·pyqt
Json____1 小时前
1. 使用springboot做一个音乐播放器软件项目【前期规划】
java·spring boot·后端·音乐播放器·音乐播放器项目·java 练习项目
wclass-zhengge1 小时前
05容器篇(D2_集合 - D5_企业容器常用 API)
java·开发语言
北冥有鱼-.1 小时前
Java到底是值传递还是引用传递????
java·开发语言