1、Maven依赖
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.core</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.document</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.template</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
<version>2.0.2</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
<version>2.0.2</version>
</dependency>
2、.docx或.doc格式的word模板准备
- 创建.docx文件,编写内容
- 添加编辑域
按Ctrl+F9,创建编辑域
右击,选择编辑域
选择邮件合并,修改域代码
要注意域代码的格式为:MERGEFIELD ${name}
name为需要填充的内容。
依次类推,填上所有的编辑域,调整文档格式等,就完成了word文档准备。
之后需要代码读word模板转数据流,进行代码域
的变量批量替换,重新写文件就完成的word文件生成工作。
3、读word模板,批量替换代码域,生成文件,demo
package com.dongzi.utils.word;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
/**
* 读word模板,生成数据
*/
public class ReadWordTemplate {
public static void main(String[] args) throws IOException, XDocReportException {
// 从resources/template中获取word模板数据
IXDocReport ixDocReport = readWord("info.docx");
IContext context = ixDocReport.createContext();
// set value
// putTemplateValue_1(context);
// putTemplateValue_2(context);
putTemplateValue_3(context);
// =============
FileOutputStream out = new FileOutputStream("D:/temp/docx模板输出.docx");
ixDocReport.process(context, out);
out.flush();
out.close();
}
public static IXDocReport readWord(String fileName) throws IOException, XDocReportException {
// 读模板的方式
// 方式1:通过URL加载
// URL url = ClassLoader.getSystemClassLoader().getResource("template/" + fileName);
// assert url != null;
// InputStream in_1 = url.openStream();
// 方式2:系统资源转数据流
InputStream in_2 = ClassLoader.getSystemResourceAsStream("template/" + fileName);
// 方式3:spring的类加载器,获取资源
// ClassPathResource pathResource = new ClassPathResource("template/" + fileName);
// InputStream in_3 = pathResource.getInputStream();
return XDocReportRegistry.getRegistry().loadReport(in_2, TemplateEngineKind.Freemarker);
}
// 设置docx模板值
public static void putTemplateValue_1(IContext context) {
// docx文档模板读取,必须要预先再模板里面设置文本域,Ctrl+F9
/*
1. Ctrl+F9,打开编辑域
2. 域选择“邮件合并”,域代码为:MERGEFIELD ${yourAddress}
3. 页面展示的格式为:«${yourAddress}»,模板可替换
*/
context.put("yourName", "孙悟空");
context.put("yourAge", "500");
context.put("yourAddress", "花果山水帘洞");
}
public static void putTemplateValue_2(IContext context) {
// 生成数据
Map<String, Object> mapValues = new HashMap<>();
mapValues.put("yourName", "齐天大圣");
mapValues.put("yourAge", 36000);
mapValues.put("yourAddress", "花果山水帘洞");
//
context.putMap(mapValues);
}
public static void putTemplateValue_3(IContext context) {
// 生成数据
Map<String, Object> mapValues = new HashMap<>();
mapValues.put("yourName", "派大星");
mapValues.put("yourAge", 36000);
mapValues.put("yourAddress", "黄土高坡");
for (int i = 1; i <= 10; i++) {
mapValues.put("index_" + i, i);
mapValues.put("value_" + i, i + 2);
}
//
context.putMap(mapValues);
}
}
4、结果展示
至此,整个模板读取生成过程全部结束。