我有带有一些占位符的 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));
}
}
}
}
但这很少起作用,因为占位符通常会跨多个文本运行。
I tried 从模板解组但它也很少起作用。
这个问题该如何解决呢?
您可以使用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# 人员也可以使用此功能
See here了解更多信息VariableReplace
or here for VariablePrepare
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)