问题记录:word文件模板导出

531 阅读2分钟

导出为word文件

根据模板生成word文件

方案选择

  1. 使用第三方Java工具类库Hutool的Word工具类,参考网址为www.hutool.cn/docs/#/poi/…;

  2. 利用Apache POI和FreeMarker模板引擎;

  3. 通过XDocReportFreeMarker模板引擎

第一种方式无法生成有表格的文档,第二种poi的实现是word转xml,xml再zhuanftl,不适合模板导出,使用第三种方式实现

前提条件

需要Microsoft 365或其他版本较高的Word编辑器

首先制作模板

选择替换的文字,然后键盘使用 Ctrl + F9 组合键将其设置为域,此时文本会被"{}"包围,接着鼠标右键选择【编辑域(E)...】

在弹出的对话框中,类别选择“邮件合并”,域名选择 "MergeField",域属性中的域名填入模版表达式${city} image.png

替换后的模板效果为:

时  间: «${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目录下