ApachePOI利用模板幻灯片文件制作PPT

2023-07-11 462点热度 0人点赞 0条评论

项目中遇到一个需求是生成PPT文件,但是一般来说,PPT会比较复杂,我们的做法是先用WPS或者Powerpoint制作好模板PPT文件(模板文件里使用文本占位符${placeholder}来表示要替换的地方),然后读取模板文件,生成实际需要的PPT文件。

如图,使用文本占位符:

代码如下:

public void generatePPT() {
    // 读取模板ppt
    Path path = Paths.get(pptTemplateFile);
    XMLSlideShow templatePPT = new XMLSlideShow(Files.newInputStream(path));

    // 生成的PPT
    XMLSlideShow ppt0 = new XMLSlideShow(Files.newInputStream(path));
    List<XSLFSlide> slides0 = templatePPT.getSlides();
    // ppt0也是从模板复制过来的,先删除里面所有的页面,然后再一个一个的添加
    for (int j = slides0.size() - 1; j >= 0; j--) {
        ppt0.removeSlide(j);
    }

    List<XSLFSlide> slides = templatePPT.getSlides();

    // 要替换的模板PPT的第几页
    XSLFSlide slide = slides.get(8);

    XSLFSlide slide1 = ppt0.createSlide();
    slide1.importContent(slide);

    // 替换文本内容
    String className = "五年级4班";
    replaceSlideTextContent(slide1, "${className}", className, 22.0, Color.WHITE);

    byte[] imageData = ...;//准备要替换的图片
    PictureData pictureData = ppt0.addPicture(imageData, XSLFPictureData.PictureType.JPEG);
    replaceSlidePicture(slide1, "${classCourseQR}", pictureData);

    // 其他页面可以继续一页一页的添加
}

// 用图片替换占位符
private void replaceSlidePicture(XSLFSlide slide, String pattern, PictureData pictureData) {
    List<XSLFShape> shapes = slide.getShapes();

    for (int i = 0; i < shapes.size(); i++) {

        Rectangle2D anchor = shapes.get(i).getAnchor();
        if (shapes.get(i) instanceof XSLFTextBox) {
            XSLFTextBox txShape = (XSLFTextBox) shapes.get(i);
            if (txShape.getText().contains(pattern)) {

                XSLFPictureShape xslfPictureShape = slide.createPicture(pictureData);
                xslfPictureShape.setAnchor(anchor);

                slide.removeShape(txShape);
            }
        }
    }
}

// 用文本替换占位符,可以设置字体大小和颜色
private void replaceSlideTextContent(XSLFSlide slide, String pattern, String content, Double fontSize, Color textColor) {
    List<XSLFShape> shapes = slide.getShapes();

    for (int i = 0; i < shapes.size(); i++) {
        if (shapes.get(i) instanceof XSLFTextBox) {
            XSLFTextBox txShape = (XSLFTextBox) shapes.get(i);
            if (txShape.getText().contains(pattern)) {
                // 替换文字内容.用TextRun获取替换的文本来设置样式
                txShape.setText(txShape.getText().replace(pattern, content));
                setSlideTextFont(txShape.getTextParagraphs(), fontSize, textColor);
            }
        }
    }
}

private void setSlideTextFont(List<XSLFTextParagraph> textParagraphs, Double fontSize, Color textColor) {
    if (textParagraphs.isEmpty()) {
        return;
    }
    textParagraphs.forEach(textParagraph -> {
        List<XSLFTextRun> textRuns = textParagraph.getTextRuns();
        textRuns.get(0).setFontSize(fontSize);
        textRuns.get(0).setFontColor(textColor);
        textRuns.get(0).setFontFamily("微软雅黑");
    });
}


 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论