如何用 Java 替换 Powerpoint 文件中的文本
How to replace text in Powerpoint file with Java
我有一个要求,我需要在运行时替换 Powerpoint 文件中的一些文本。 (Powerpoint 文件被用作一些 placeholders/tokes 例如 {{USER_NAME}} 的模板)
我试过使用 POI 但没有成功。
我参考了论坛上的其他链接并从 'docx4j' 开始,但我无法超越一点并且文档不是很清楚(至少对我而言)。
这是我到目前为止所做的:
已将 PPTX 加载到 'PresentationMLPackage'
获得 'MainPresentationPart' 和幻灯片(使用 mainPresentationPart.getSlide(n);)
但我不确定接下来的步骤(或者这是否是正确的方法)。
如有任何建议,我们将不胜感激。
非常感谢,
-维尼
SlidePart extends JaxbPmlPart<Sld>
JaxbPmlPart<E> extends JaxbXmlPartXPathAware<E>
JaxbXmlPartXPathAware<E> extends JaxbXmlPart<E>
JaxbXmlPart 包含:
/**
* unmarshallFromTemplate. Where jaxbElement has not been
* unmarshalled yet, this is more efficient (3 times
* faster, in some testing) than calling
* XmlUtils.marshaltoString directly, since it avoids
* some JAXB processing.
*
* @param mappings
* @throws JAXBException
* @throws Docx4JException
*
* @since 3.0.0
*/
public void variableReplace(java.util.HashMap<String, String> mappings) throws JAXBException, Docx4JException {
// Get the contents as a string
String wmlTemplateString = null;
if (jaxbElement==null) {
PartStore partStore = this.getPackage().getSourcePartStore();
String name = this.getPartName().getName();
InputStream is = partStore.loadPart(
name.substring(1));
if (is==null) {
log.warn(name + " missing from part store");
throw new Docx4JException(name + " missing from part store");
} else {
log.info("Lazily unmarshalling " + name);
// This seems to be about 5% faster than the Scanner approach
try {
wmlTemplateString = IOUtils.toString(is, "UTF-8");
} catch (IOException e) {
throw new Docx4JException(e.getMessage(), e);
}
}
} else {
wmlTemplateString = XmlUtils.marshaltoString(jaxbElement, true, false, jc);
}
// Do the replacement
jaxbElement = (E)XmlUtils.unwrap(
XmlUtils.unmarshallFromTemplate(wmlTemplateString, mappings, jc));
}
因此,一旦有了幻灯片部分,就可以对其调用 variableReplace。您需要您的变量采用 XmlUtils.unmarshallFromTemplate
预期的格式
我有一个要求,我需要在运行时替换 Powerpoint 文件中的一些文本。 (Powerpoint 文件被用作一些 placeholders/tokes 例如 {{USER_NAME}} 的模板) 我试过使用 POI 但没有成功。 我参考了论坛上的其他链接并从 'docx4j' 开始,但我无法超越一点并且文档不是很清楚(至少对我而言)。 这是我到目前为止所做的: 已将 PPTX 加载到 'PresentationMLPackage' 获得 'MainPresentationPart' 和幻灯片(使用 mainPresentationPart.getSlide(n);)
但我不确定接下来的步骤(或者这是否是正确的方法)。
如有任何建议,我们将不胜感激。
非常感谢, -维尼
SlidePart extends JaxbPmlPart<Sld>
JaxbPmlPart<E> extends JaxbXmlPartXPathAware<E>
JaxbXmlPartXPathAware<E> extends JaxbXmlPart<E>
JaxbXmlPart 包含:
/**
* unmarshallFromTemplate. Where jaxbElement has not been
* unmarshalled yet, this is more efficient (3 times
* faster, in some testing) than calling
* XmlUtils.marshaltoString directly, since it avoids
* some JAXB processing.
*
* @param mappings
* @throws JAXBException
* @throws Docx4JException
*
* @since 3.0.0
*/
public void variableReplace(java.util.HashMap<String, String> mappings) throws JAXBException, Docx4JException {
// Get the contents as a string
String wmlTemplateString = null;
if (jaxbElement==null) {
PartStore partStore = this.getPackage().getSourcePartStore();
String name = this.getPartName().getName();
InputStream is = partStore.loadPart(
name.substring(1));
if (is==null) {
log.warn(name + " missing from part store");
throw new Docx4JException(name + " missing from part store");
} else {
log.info("Lazily unmarshalling " + name);
// This seems to be about 5% faster than the Scanner approach
try {
wmlTemplateString = IOUtils.toString(is, "UTF-8");
} catch (IOException e) {
throw new Docx4JException(e.getMessage(), e);
}
}
} else {
wmlTemplateString = XmlUtils.marshaltoString(jaxbElement, true, false, jc);
}
// Do the replacement
jaxbElement = (E)XmlUtils.unwrap(
XmlUtils.unmarshallFromTemplate(wmlTemplateString, mappings, jc));
}
因此,一旦有了幻灯片部分,就可以对其调用 variableReplace。您需要您的变量采用 XmlUtils.unmarshallFromTemplate
预期的格式