我的 docx 文件为 downloadable file现在我想用数据库中的实际值替换“#buyer_bill_no#”,比如“132564”,现在这对于普通文本检查文件作为引用工作正常,但是当文本位于文本框或矩形中(如文档中所示)时,它无法识别可替换元素,即“#buyer_bill_no#”
private static List<Object> getAllElementFromObject(Object obj, Class<?> toSearch) throws Docx4JException {
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;
}
上面的方法获取所有元素,在下面的方法中我打印文档中的所有元素
private void replacePlaceholder(WordprocessingMLPackage template, String name, String placeholder) throws Docx4JException {
List<Object> texts = getAllElementFromObject(template.getMainDocumentPart(), Text.class);
for (Object text : texts) {
Text textElement = (Text) text;
System.out.println("@@@@elements@@@@"+textElement.getValue());
if (textElement.getValue().equals(placeholder)) {
textElement.setValue(name);
}
}
}
输出为:@@@@elements@@@@购买订单号:
@@@@elements@@@@#buyer_bill_no#
@@@@元素@@@@
无法识别文档中文本框和矩形中的元素。
最佳答案
看起来您的方法 getAllElementFromObject 递归到 ContentAccessor 对象;显然 w:pict 或其后代之一没有实现 ContentAccessor 接口(interface):
<w:pict>
<v:rect >
<v:textbox>
<w:txbxContent>
<w:p>
<w:r>
<w:t>#buyer_bill_no#</w:t>
</w:r>
尝试 TraversalUtils,或 https://github.com/plutext/docx4j/tree/master/src/main/java/org/docx4j/utils 中的类之一
关于java - 如何使用 docx4j 识别 TextBox 中的文本并替换占位符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29555661/