我有带有一些占位符的 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# 人员也可以使用此功能
关于java - docx4j 查找和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19676282/