java - docx4j 查找和替换

标签 java docx docx4j

我有带有一些占位符的 docx 文档。现在我应该用其他内容替换它们并保存新的 docx 文档。我从 docx4j 开始并找到了这个方法:

public static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) {
    List<Object> result = new ArrayList<Object>();
    if (obj instanceof JAXBElement) obj = ((JAXBElement<?>) obj).getValue();

    if (obj.getClass().equals(toSearch))
        result.add(obj);
    else if (obj instanceof ContentAccessor) {
        List<?> children = ((ContentAccessor) obj).getContent();
        for (Object child : children) {
            result.addAll(getAllElementFromObject(child, toSearch));
        }
    }
    return result;
}

public static void findAndReplace(WordprocessingMLPackage doc, String toFind, String replacer){
    List<Object> paragraphs = getAllElementFromObject(doc.getMainDocumentPart(), P.class);
    for(Object par : paragraphs){
        P p = (P) par;
        List<Object> texts = getAllElementFromObject(p, Text.class);
        for(Object text : texts){
            Text t = (Text)text;
            if(t.getValue().contains(toFind)){
                t.setValue(t.getValue().replace(toFind, replacer));
            }
        }
    }
}

但这很少起作用,因为占位符通常会跨多个文本运行。

我试过UnmarshallFromTemplate但它也很少起作用。

这个问题如何解决?

最佳答案

您可以使用VariableReplace来实现这一点,这在其他答案时可能不存在。 这本身并不执行查找/替换,但适用于占位符,例如 ${myField}

java.util.HashMap mappings = new java.util.HashMap();
VariablePrepare.prepare(wordMLPackage);//see notes
mappings.put("myField", "foo");
wordMLPackage.getMainDocumentPart().variableReplace(mappings);

请注意,您不要传递 ${myField} 作为字段名称;而是传递未转义的字段名称 myField - 这是相当不灵活的,因为目前的情况是,占位符必须采用 ${xyz} 格式,而如果您可以传递任何内容那么你可以用它来进行任何查找/替换。 docx4j.NET 中的 C# 人员也可以使用此功能

参见here有关 VariableReplacehere 的更多信息对于VariablePrepare

关于java - docx4j 查找和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19676282/

相关文章:

java - 在一个 session 中记录方法调用以便在未来的测试 session 中重播?

java - 使用 Apache Poi 从固定位置的模板复制表

java - docx4j/xlsx4j : create simple spreadsheet

java - 有没有办法在java中禁用Word文档的拼写检查?

java - DOCX4J:如何向 docx 模板中的现有表添加行?

Java进程在没有记录的情况下被杀死

java - 封装——当 setter 已经公开时,为什么我们需要它?

java - 使用 Apache POI 从 docx 文件读取表

java - docx4j 创建编号和未编号列表

java - 自定义 MapReduce 输入格式 - 找不到构造函数