导入依赖
<!--xdocreport必备的依赖-->
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.document</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.core</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.template</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.converter</artifactId>
<version>2.0.1</version>
</dependency>
<!--模板引擎相关-->
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
<version>2.0.1</version>
</dependency>
<!--文档格式相关-->
<dependency>
<groupId>fr.opensagres.xdocreport</groupId>
<artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
<version>2.0.1</version>
</dependency>
2 插件
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
<!-- 过滤后缀文件 -->
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.json</include>
<include>**/*.ftl</include>
</includes>
</resource>
</resources>
3
@ApiOperation(value = "申请模板导出")
@GetMapping("/exportApplyTemplate")
public void exportApplyTemplate(HttpServletResponse response, @RequestParam("id") Integer id)throws IOException {
try {
InputStream ins = null;
CoalitionCompanyV0 companyV0 = coalitionCompanyService.detail(id);
if (companyV0 != null) {
//String templateFileName = "C:\\Users\\555li\\Desktop\\companyApply_template.docx";
//String templateFileName = reportTemplate+"/orderdailysummary_template.xlsx";
Resource resource = new ClassPathResource("OfficeTmpe/companyApply_template.docx");
String templateFileName = resource.getFile().getPath();
//获取Word模板,模板存放路径在项目的resources目录下
ins = new FileInputStream(templateFileName);
//ins = this.getClass().getResourceAsStream("/OfficeTmpe/companyApply_template.docx");
//注册xdocreport实例并加载FreeMarker模板引擎
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins, TemplateEngineKind.Freemarker);
//创建xdocreport上下文对象
IContext context = report.createContext();
//创建要替换的文本变量 方式1
//context.put(“num”, “2233”);
//创建要替换的文本实体类 方式2
context.put("company", companyV0);
/* //创建字段元数据
FieldsMetadata fm = report.createFieldsMetadata();
//Word模板中的表格数据对应的集合类型 方式1 list
//fm.load("company", CoalitionCompanyV0.class, true);
//Word模板中的表格数据对应的集合类型 方式2 实体
fm.load("company", CoalitionCompanyV0.class, false);*/
String eTag = String.valueOf(System.currentTimeMillis());
String fileName = "丝路海运联盟章程及申请表("+companyV0.getName()+").docx";
//输出到本地目录 // FileOutputStream out = new FileOutputStream(“D://cc10.docx”);
//浏览器下载
response.setCharacterEncoding("utf-8");
response.setContentType("application/msword");
response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));
report.process(context, response.getOutputStream());
}
} catch (Exception e) {
response.reset();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
Map<String, String> map = new HashMap<String, String>(16);
map.put("status", "failure");
map.put("message", "下载文件失败" + e.getMessage());
response.getWriter().println(JSON.toJSONString(map));
}
}
4模板制作,效果如图
![](https://img-blog.csdnimg.cn/img_convert/507fc747ca7d6a12a3f13b5030f45524.png)
4.1在需要插入动态数据的位置,按键盘 Ctrl + F9 生成域
![](https://img-blog.csdnimg.cn/img_convert/4f913bfefe7ba1efbf31c7788f2e56cb.png)
4.2右键点击上面的域,选择“编辑域”
4.3选择“邮件合并” ,再在域代码处 输入对应字段 ${contractName}
![](https://img-blog.csdnimg.cn/img_convert/66fa8b97dc7156673dd529bcdae4df31.png)
4.4对象列表数据的处理: ${对象.属性} ,如 ${opinions.opinion}
![](https://img-blog.csdnimg.cn/img_convert/60c1ff3a2f070ee7798fc19e91f6ba95.png)
4.5图片数据处理: 先 插入 任意图片,作为模板图片,再点击书签 ,输入书签名,并点击 “添加” 按钮
![](https://img-blog.csdnimg.cn/img_convert/bd6c35ac40e1f5d3505159bf57b40028.png)
![](https://img-blog.csdnimg.cn/img_convert/1686109ed282802a6707c1cfb703bf69.png)
4.6由于我的图片列表数据,在图片所在行依次添加 如下两个域
"@before-row[#list picList as item]"
说明: picList as item ,其中 picList 对应代码中的列表数据, item为每项数据
![](https://img-blog.csdnimg.cn/img_convert/7397c295f6d72d957a8cbc2fd6af27c4.png)
"@after-row[/#list]"
![](https://img-blog.csdnimg.cn/img_convert/095e3bddde3a3c0e5c9d519d287c584e.png)
效果如下
![](https://img-blog.csdnimg.cn/img_convert/a8aa17d53bb49d8e4882b6be7879f44e.png)
解决图片不存在时, “现场照片” 列被隐藏问题
在对应的单元格中再加一个单元格, 将图片和对应遍历用的两个域放在其中, 并编辑图片布局,如下
![](https://img-blog.csdnimg.cn/img_convert/7fa69e4efc076f179a23a5513eaf3807.png)