提问人:Wortig 提问时间:8/19/2023 更新时间:8/23/2023 访问量:51
如何使用docx4j将docx模板中所有未设置的变量设置为空字符串?
How to set all unset variables in docx template to empty string using docx4j?
问:
我使用 在我的 .docx 文档中定义了一些变量。然后,我使用 和 方法通过映射数据替换这些变量。但是,如果某些变量在映射中不存在,则生成的变量将设置为变量名称。${<VAR NAME HERE>}
VariablePrepare.prepare(doc)
document.getMainDocumentPart().variableReplace(placeholders)
VariablePrepare.prepare(document);
val placeholders = new HashMap<>(PLACEHOLDERS_STATIC);
if (data != null) {
final HashMap<String, String> dynamicPlaceholders = new HashMap<>() {{
put("firstName", "First name");
put("firstNameVal", data.getFirstName());
put("childTable", "Child");
put("lastName", "Last name");
}};
placeholders.putAll(dynamicPlaceholders);
document.getMainDocumentPart().variableReplace(placeholders);
}
模板:
我希望未填充的变量是一个空字符串,而不是它们的名称。这可以在 docx4j 中完成吗?在拥有大量文档的情况下,用空字符串填充所有键作为要映射的值非常耗时。
屬地:
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
<version>11.4.9</version>
</dependency>
答:
0赞
JasonPlutext
8/23/2023
#1
没有内置的方法可以做到这一点,但你可以尝试如下:
public static class TraversalUtilTextVisitor extends TraversalUtilVisitor<Text> {
@Override
public void apply(Text text, Object parent, List<Object> siblings) {
if (text.getValue().contains("${")
) {
int startPos = text.getValue().indexOf("${");
int endPos = text.getValue().indexOf("}", startPos);
if (endPos > -1) {
text.setValue(text.getValue().substring(0, startPos) + text.getValue().substring(endPos+1));
} else {
System.out.println("Malformed variable in " + text.getValue());
}
}
}
}
使用以下命令调用它:
SingleTraversalUtilVisitorCallback textVisitor
= new SingleTraversalUtilVisitorCallback(
new TraversalUtilTextVisitor());
textVisitor.walkJAXBElements(wordMLPackage.getMainDocumentPart().getContents().getBody());
笔记:
- 如果您有 <text>此元素包含 ${var1} 和 ${var2}</text>,则此代码将仅处理 ${var1}
- 如果您的页眉/页脚、脚注/尾注中有变量,则必须单独处理这些部分。
评论