从 java 中的模板文件创建 docx 文件
Create docx file from a template file in java
我需要根据模板创建 docx 文件。
该模板应包含占位符,我应该能够从 java 中填充占位符。
是否可以这样做,如果可以,请建议我这样做的好方法。
正如之前其他地方所讨论的,有 3 种基本方法:
最佳:内容控制数据绑定
cheap/cheerful:变量替换(即文档表面的魔术字符串),但很脆弱(拆分运行问题)
LEGACY:MERGEFIELD 有或没有其他字段代码。
Docx4j 支持所有三种方法,但我们通常推荐内容控制数据绑定,因为它符合 Microsoft 的方向(尽可能确定),并且最强大。
您需要考虑模板作者的技术技能。
有关简单的 "Variable replacement" 方法,请参阅 https://github.com/centic9/poi-mail-merge。如果一个替换字符串应用了多种格式,它就不起作用,但对于精心制作模板的简单情况,它确实有效。
基本上它从 CSV 或 Excel 文件中读取模板和数据,然后将其合并到多个结果文件中,每一行数据一个。
它适用于 DOCX XML 内容,因此没有完全使用 Apache POI XWPF 支持,但这种方式可以按预期使用模板中的格式和其他内容,而无需完全支持Apache POI(DOCX 支持仍然作为 "scratchpad" 组件的一部分,因为支持尚未完全完成)。
您可以使用具有以下 LINQ 报告语法的 Word 模板,使用 Aspose.Words 实现您的要求 Java。
<< tag_name [表达式] -switch1 -switch2 ...>>
标签体通常由以下元素组成:
- 标签名称
- 用方括号括起来的表达式
- 标签可用的一组开关,每个开关前面都有“-”字符
假设您在应用程序中定义了发件人 class,如下所示:
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 工作,担任开发人员布道师。
原始问题有点晚了,但是如果其他人需要从模板动态创建 docx 文档,您可能想看看 DocxStamper Java library which I created on top of docx4j。
它允许在 docx 模板中使用 Spring Expression Language,您可以使用如下几行代码从模板创建文档:
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();
我需要根据模板创建 docx 文件。 该模板应包含占位符,我应该能够从 java 中填充占位符。 是否可以这样做,如果可以,请建议我这样做的好方法。
正如之前其他地方所讨论的,有 3 种基本方法:
最佳:内容控制数据绑定
cheap/cheerful:变量替换(即文档表面的魔术字符串),但很脆弱(拆分运行问题)
LEGACY:MERGEFIELD 有或没有其他字段代码。
Docx4j 支持所有三种方法,但我们通常推荐内容控制数据绑定,因为它符合 Microsoft 的方向(尽可能确定),并且最强大。
您需要考虑模板作者的技术技能。
有关简单的 "Variable replacement" 方法,请参阅 https://github.com/centic9/poi-mail-merge。如果一个替换字符串应用了多种格式,它就不起作用,但对于精心制作模板的简单情况,它确实有效。
基本上它从 CSV 或 Excel 文件中读取模板和数据,然后将其合并到多个结果文件中,每一行数据一个。
它适用于 DOCX XML 内容,因此没有完全使用 Apache POI XWPF 支持,但这种方式可以按预期使用模板中的格式和其他内容,而无需完全支持Apache POI(DOCX 支持仍然作为 "scratchpad" 组件的一部分,因为支持尚未完全完成)。
您可以使用具有以下 LINQ 报告语法的 Word 模板,使用 Aspose.Words 实现您的要求 Java。
<< tag_name [表达式] -switch1 -switch2 ...>>
标签体通常由以下元素组成:
- 标签名称
- 用方括号括起来的表达式
- 标签可用的一组开关,每个开关前面都有“-”字符
假设您在应用程序中定义了发件人 class,如下所示:
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 工作,担任开发人员布道师。
原始问题有点晚了,但是如果其他人需要从模板动态创建 docx 文档,您可能想看看 DocxStamper Java library which I created on top of docx4j。
它允许在 docx 模板中使用 Spring Expression Language,您可以使用如下几行代码从模板创建文档:
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();