我正在尝试根据不同的输入/为我创建的同一 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/