从java中的模板文件创建docx文件

时间:2016-08-26 15:14:12

标签: apache-poi docx4j aspose aspose.words dox

我需要根据模板创建docx文件。 模板应该包含占位符,我应该能够从java填充占位符。 是否有可能做到这一点,如果是这样,建议我采用这种方法做得很好而有效。

4 个答案:

答案 0 :(得分:1)

如前所述,有三种基本方法:

  1. BEST:内容控制数据绑定

  2. cheap / cheerful:可变替换(即文档表面上的魔术字符串),但是很脆弱(分裂运行问题)

  3. LEGACY:MERGEFIELD包含或不包含其他字段代码。

  4. Docx4j支持所有这三种方法,但我们通常建议使用内容控制数据绑定,因为它与Microsoft的方向一致(最好可以确定),并且功能最强大。

    您想要考虑模板作者的技术技能。

答案 1 :(得分:1)

有关简单的“变量替换”方法,请参阅https://github.com/centic9/poi-mail-merge。如果一个替换字符串应用了多种格式,则它不起作用,但对于精心制作模板的简单情况确实有效。

基本上,它从CSV或Excel文件中读取模板和数据,然后将其合并到多个结果文件中,每个数据行一个。

它适用于DOCX XML内容,因此没有完全使用Apache POI XWPF支持,但这种格式化和模板中的其他内容按预期使用,而不需要完全支持Apache POI中的所有内容(其中包含DOCX)支持仍然作为“暂存器”组件的一部分,因为支持尚未完全完成。)

答案 2 :(得分:1)

您可以使用Word模板和LINQ报告的以下语法来使用Aspose.Words for Java来满足您的需求。

<< tag_name [expression] -switch1 -switch2 ...>>

标签正文通常由以下元素组成:

  • 标签名称
  • 括号括起来的表达式
  • 可用于标记的一组开关,每个开关前面都有“ - ”字符

假设您在应用程序中定义了Sender类,如下所示:

public class Sender {
    public Sender(String name, String message) {
        _name = name;
        _message = message;
    }

    public String getName() {
        return _name;
    }

    public String getMessage() {
        return _message;
    }

    private String _name;
    private String _message;
}

要生成包含代表其的具体发件人消息的报告,您可以使用包含以下内容的模板文档。

<< [s.getName()]>>说:"<< [s.getMessage()]>>。"

要从模板构建报告,您可以使用以下源代码。

Document doc = new Document(getMyDir() + "temp_HelloWorld.docx");

Sender sender = new Sender("LINQ Reporting Engine", "Hello World");
ReportingEngine engine = new ReportingEngine();
engine.buildReport(doc, sender, "s");

doc.save(getMyDir() + "out.docx");

我与Aspose一起担任开发人员传播者。

答案 3 :(得分:1)

对于原始问题有点迟了,但如果其他人需要从模板动态创建docx文档,您可能需要查看我在{{3}之上创建的DocxStamper Java库。 }。

它允许在docx模板中使用docx4j,您可以使用以下几行来创建模板中的文档:

MyData data = ...;           // your own POJO containing the data      
InputStream template = ...;  // InputStream to the template file
OutputStream out = ...;      // OutputStream to the resulting document
DocxStamper stamper = new DocxStamperConfiguration()
    .build();
stamper.stamp(template, context, out);
out.close();