导出为word文件
根据模板生成word文件
方案选择
-
使用第三方Java工具类库Hutool的Word工具类,参考网址为www.hutool.cn/docs/#/poi/…;
-
利用Apache POI和FreeMarker模板引擎;
-
通过XDocReport和FreeMarker模板引擎
第一种方式无法生成有表格的文档,第二种poi的实现是word转xml,xml再zhuanftl,不适合模板导出,使用第三种方式实现
前提条件
需要Microsoft 365或其他版本较高的Word编辑器
首先制作模板
选择替换的文字,然后键盘使用 Ctrl + F9 组合键将其设置为域,此时文本会被"{}"包围,接着鼠标右键选择【编辑域(E)...】
在弹出的对话框中,类别选择“邮件合并”,域名选择 "MergeField",域属性中的域名填入模版表达式${city}
替换后的模板效果为:
时 间: «${meetingDate}»****
地 点: «${meetingLocation}»****
议 题: «${meetingTitle}»****
表格也是一样,效果如下
表 格:****
| «${xfList.deptName}» | «${xfList.memberName}» | «${xfList.postName}» | «${xfList.leaveReason}» |
|---|
实现
依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls</artifactId>
<version>2.6.0</version>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jxls</groupId>
<artifactId>jxls-poi</artifactId>
<version>1.2.0</version>
</dependency>
<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>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.5</version>
</dependency>
具体实现
//获取Word模板,模板存放路径在项目的resources目录下
InputStream ins = this.getClass().getResourceAsStream("/模板文件.docx");
//注册xdocreport实例并加载FreeMarker模板引擎
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(ins,
TemplateEngineKind.Freemarker);
//创建xdocreport上下文对象
IContext context = report.createContext();
//创建要替换的文本变量
String date = "";
String location = "";
String title = "";
//加业务逻辑,填充date/location/title值
context.put("meetingDate", date);
context.put("meetingLocation", location);
context.put("meetingTitle", title);
//表格数据
List<MeetingMemberExcel> jjgMemberList = new ArrayList<>();
//加业务逻辑,填充表格数据
context.put("jjgList", jjgMemberList);
FieldsMetadata fm = report.createFieldsMetadata();
//Word模板中的表格数据对应的集合类型
fm.load("jjgList", MeetingMemberExcel.class, true);
//导出响应头设置
response.setCharacterEncoding(Charsets.UTF_8.name());
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
String fileName = URLEncoder.encode("导出文件名", Charsets.UTF_8.name());
response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
//输出到本地目录或者浏览器响应
report.process(context, response.getOutputStream());
注意事项: 1.模板的各个域设置好了变量,那么导出数据则不能为空 2.注意word环境,Microsoft 365打开,存放模板到resource目录下