简介
1本文主要使用XDocReport +FreeMarker,该技术组合既简单又高效可实现word模板的编辑,docx和doc均可处理,可以动态的生成表格。
pom文件引入
可以适当的提升版本目前最新的是2.0.6
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.core</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.document</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.template</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
动态文本替换
首先打开你需要导出word模版:
选择插入,然后选择文档部件选择域,在类别中选择邮件合并。
word模版中:
代码中:
ins = new FileInputStream("C:\\Users\\86182\\Desktop\\服务类合同模板.docx");
// 注册xdocreport实例并加载FreeMarker模板引擎
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins, TemplateEngineKind.Freemarker);
// 创建xdocreport上下文对象,用于存放具体数据
IContext context = report.createContext();
// 创建要替换的文本变量,并去除所有空格
context.put("jia", payContractHead.getFirst() != null ? payContractHead.getFirst().replaceAll("\\s+", "") : "");
context.put("yi", payContractHead.getSecond() != null ? payContractHead.getSecond().replaceAll("\\s+", "") : "");
context.put("agreementNum", payContractHead.getNum() != null ? payContractHead.getNum().replaceAll("\\s+", "") : "");
context.put("contractName", payContractHead.getContractName() != null ? payContractHead.getContractName().replaceAll("\\s+", "") : "");
导出后的结果
表格生成
首先自己需要建一个表格 只需要在第一行打上需要填写的内容,payContractLotList这个要与代码当中对应是一个list。其中PayContractItem是实体类,查询数据库的时候需要使用List来进行接收,如果使用List<Map<String, Object>>来接收需要进行转换。
代码片段:
context.put("payContractLotList", payContractLotList);
context.put("payContractItemList",payContractItemList);
FieldsMetadata fm = report.createFieldsMetadata();
fm.load("payContractItemList", PayContractItem.class, true);
fm.load("payContractLotList", PayContractLot.class, true);