我的Word文件看起来像这样:
您无需了解内容,只需查看我的占位符<env>
和<applikationsabkürzung>
即可。这些占位符有10页,现在我应该用其他内容替换它们。黑色和黄色的盒子是公司图片,我不会分享。
现在我开始阅读整个docx4j doc并在一段时间后生成以下代码:
public void manipulateWord(String path, String env, String appl) {
try {
WordprocessingMLPackage wpml = WordprocessingMLPackage.load(new File(path));
MainDocumentPart mdp = wpml.getMainDocumentPart();
List<Object> content = mdp.getContent();
// Include all Strings to replace
HashMap<String, String> mappings = new HashMap<String, String>();
mappings.put("<env>", env);
mappings.put("<applikationsabkürzung>", appl);
for (Object object : content) {
Text textElement = (Text) object;
String textToReplace = textElement.getValue();
if (mappings.keySet().contains(textToReplace)) {
textElement.setValue(mappings.get(textToReplace));
}
}
wpml.save(new File("C:\\Users\\kristina\\Desktop\\outputfile.docx"));
} catch (Docx4JException e) {
LOG.error(e);
}
一些解释:
String path
是上图中文件的路径String env
是应替换<env>
String appl
是应替换<applikationsabkürzung>
但是当我运行该方法时,没有任何反应,我的控制台只打印了一些信息。如果他们很重要,我会编辑帖子,但我不这么认为。
那我的错在哪里?它会那样工作吗?我很快就绝望了......
答案 0 :(得分:3)
MainDocumentPart.getContent()
将返回主文档流中的所有OpenXml组件(页眉和页脚之类的内容都有自己的元素)。您的代码假设List<Object> content
的结果将是Text
元素的集合,但不一定如此。例如,典型的(简单)文档结构如下:
P // Paragraph element
-> R // Run element
-> Text // Text element
...所以getContent()
很可能会在开始时吐出大量P
个对象。
有几种方法可以遍历docx4文件 - 请参阅主要docx4j网站了解更多信息 - 但下面的方法中显示了一种方法。您可以将MaindocumentPart
作为第一个对象传递,并将Text.class
作为要搜索的对象类型。这应该有助于识别包含您的一个映射值的所有Text
元素:
public 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;
}