java - Apache POI PPT (Java) - 更新 TextShape 保持文本格式/形状格式

标签 java apache-poi powerpoint

我正在尝试根据不同的输入/为我创建的同一 PPTX 模板上的不同用户生成多个报告(即 N 个 PPTX 文件)。

我在 PPTX 模板上有几个预格式化的 XSLFTextShape,其中包含一个已格式化的 XSLFTextParagraph(即形状和文本)。每个形状都包含一个特定的占位符,我需要用动态值替换它。我在 map 中有这个值(占位符,newValue)。我成功地使用新值更新占位符:

textShape.clearText();
XSLFTextRun run = paragraph.addNewTextRun();
run.setText(newText);

因此,当我在输出中生成 PPTX 时,文本会更新,但字体颜色、字体格式、字体大小与我在模板中定义的相比会发生变化。如何保持相同的格式?

有什么解决方案可以在保持原始格式的同时简单地更改文本吗?

提前致谢!

最佳答案

对于将来可能对此主题感兴趣的每个人 - 我发布了解决方案(如果一个文本框只有一个段落,则有效)。此解决方案在所有文本框上循环,如果其中一个文本框包含 Placeholder->newValue 映射中指定的值之一,它将更新它并保持格式。

    public static void updateTextBoxesWithDesiredValues(XMLSlideShow ppt, Map<String, String> placeHolderDefinedValue) {
    logger.info("ElapsedTime: " + tM.getTimeElapsedReadableFormat() + " ########## Updating single text box content...");
    List<XSLFSlide> allSlides = ppt.getSlides();
    int updatedElements = 0;
    for (XSLFSlide currentSlide : allSlides) {
        for (XSLFShape shape : currentSlide.getShapes()) {
            if (shape instanceof XSLFTextShape) {
                XSLFTextShape textBox = (XSLFTextShape) shape;
                String elementTextContent = textBox.getText();
                for (Object key : placeHolderDefinedValue.keySet()) {
                    if (elementTextContent.equals(key)) {
                        List<XSLFTextParagraph> textBoxParagraphs = textBox.getTextParagraphs();
                        List<XSLFTextRun> textBoxParagraphTextRuns = textBoxParagraphs.get(0).getTextRuns();
                        //System.out.println("########################## check paragraph number in textbox: " + textBoxParagraphs.size() + " - TextRuns: " + textBoxParagraphs.get(0).getTextRuns().size());
                        logger.info("ElapsedTime: " + tM.getTimeElapsedReadableFormat() + updatedElements + ") Updating: " + textBox.getText() + " --> " + placeHolderDefinedValue.get(key));
                        for (XSLFTextRun r : textBoxParagraphTextRuns) {
                            r.setText(placeHolderDefinedValue.get(key));
                        }
                        updatedElements++;
                        //break;
                    }
                }
            }

        }
    }
    logger.info("ElapsedTime: " + tM.getTimeElapsedReadableFormat() + " Total Text Element Content Updated: " + updatedElements + " #########################");
}

关于java - Apache POI PPT (Java) - 更新 TextShape 保持文本格式/形状格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46542404/

相关文章:

java - 无法从错误公式单元格获取文本值

javascript - Powerpoint 演示文稿中可编辑的 HTML、CSS 和 Javascript?

python-pptx - 如何以编程方式访问演示文稿部分标题?

JAVA字符串反转文件io中字符串的顺序

Java,无法在linux上发送邮件

java - 在/*上映射全局前端 Controller servlet时如何访问静态资源

java - 是否可以为 POI lib 创建的 Word 文档定义 xml 架构?

java - Apache POI - 在Word文件中编辑图表数据时,它返回表单中定义的数据

r - 如何在生成的 PowerPoint 中显示 R 数据框

java - Android位图调整大小