Java 使用docx4j以编程方式创建Word(.docx)文档

Java 使用docx4j以编程方式创建Word(.docx)文档,java,docx,docx4j,Java,Docx,Docx4j,我想加载模板word文档并向其添加内容,然后将其另存为新文档。以下是我的发现: private static WordprocessingMLPackage getTemplate(String name) throws Docx4JException, FileNotFoundException { WordprocessingMLPackage template = WordprocessingMLPackage.load(new java.io.File(name)); retur

我想加载模板word文档并向其添加内容,然后将其另存为新文档。以下是我的发现:

private static WordprocessingMLPackage getTemplate(String name) throws Docx4JException, FileNotFoundException {
  WordprocessingMLPackage template = WordprocessingMLPackage.load(new java.io.File(name));
  return template;
}

private 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;
}

private static void replacePlaceholder(WordprocessingMLPackage template, String name, String placeholder) {
  List<Object> texts = getAllElementFromObject(template.getMainDocumentPart(), Text.class);
  for (Object text : texts) {
    Text textElement = (Text) text;
    if (textElement.getValue().equals(placeholder)) {
      textElement.setValue(name);
    }
  }
}

private void writeDocxToStream(WordprocessingMLPackage template, String target) throws IOException, Docx4JException {
  File f = new File(target);
  template.save(f);
}

不幸的是,这不起作用,它猜测模板无法加载,我尝试了,但仍然不起作用,请提供任何帮助

您不调用WritedOxToStream吗

此外,您的代码还包含:

if (textElement.getValue().equals(placeholder))
您可能希望包含,而不是等于。解压docx并查看XML以更好地理解问题始终是值得的

在任何情况下,这都是过于复杂和低效的,因为您创建了一个新的并且可能很大的列表

请参见docx4j示例中的VariableReplace,或使用内容控制数据绑定

if (textElement.getValue().equals(placeholder))