如何使用docx4j将docx模板中所有未设置的变量设置为空字符串?

How to set all unset variables in docx template to empty string using docx4j?

提问人:Wortig 提问时间:8/19/2023 更新时间:8/23/2023 访问量:51

问:

我使用 在我的 .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);
}

模板:

enter image description here

保存变量后替换文档:enter image description here

我希望未填充的变量是一个空字符串,而不是它们的名称。这可以在 docx4j 中完成吗?在拥有大量文档的情况下,用空字符串填充所有键作为要映射的值非常耗时。

屬地:

<dependency>
    <groupId>org.docx4j</groupId>
    <artifactId>docx4j-JAXB-ReferenceImpl</artifactId>
    <version>11.4.9</version>
</dependency>
Java DocX4J

评论


答:

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());

笔记:

  1. 如果您有 <text>此元素包含 ${var1} 和 ${var2}</text>,则此代码将仅处理 ${var1}
  2. 如果您的页眉/页脚、脚注/尾注中有变量,则必须单独处理这些部分。