关于前端:freemarker实现word文档模板动态生成

携手创作,独特成长!这是我参加「掘金日新打算 · 8 月更文挑战」的第29天,点击查看流动详情

1.写在后面

很多时候,咱们可能须要依据一个word模板,动静生成,咱们所须要得一个word文档。

那这里,通过word模板生成word文档,我之前写过一个案例: word模板数据填充并转pdf

这个案例得word模板,有什么弊病呢?咱们来看一下这个word模板,格局如下:

这样得一个word模板,我之前得做法是 替换段落文本 ,那会有啥问题?

  1. 文本的格局可能会失落。
  2. 替换内容标识,可能会读取不到(单词别隔开)。
  3. 无奈动静循环输入一个list汇合。
  4. table表格无奈做到动静输入。

当然啦,因为咱们之前的业务性能比较简单,应用之前的 替换段落文本 形式,也是能实现到,所以就始终没有去钻研,有无更好的形式。

嘿,随着业务性能的不断深入,动静list汇合,动静table,这些性能也要求要实现了。

那咱们作为一个程序员,这不得深入研究嘛?

巧了,哥们这几天,也钻研了一个形式,能够实现动静list汇合,动静table的渲染,那就是 freemarker模板引擎

好了,废话不多说,间接进入主题了!!!

2.freemarker实现

首先说一下实现步骤:通过将word模板,另存为 .xml 格局,而后将 .xml 文件后缀改成 .ftl ,而后再应用freemarker模板引擎,将数据填充到 .ftl ,而后再输入成一个 word 文档。

实现步骤,还是挺清晰的。那接下来,咱们来实现一下:

2.1 word模板

例如:咱们有一个这样的api接口文档,而后咱们的零碎后盾会配置管理了很多api接口,而后导出到一个word文件。

1.输入的word文件,要带上文档目录构造(右边)

2.api的内容,要有table表格

3.api接口是一个list汇合

由此可见,如果还是用我以前的形式,预计实现起来就相当麻烦了。

那这里用freemarker,如何实现呢?freemarker的语法是:${xxxx},那咱们来革新模板,格局如下

这里为什么要用:${api.xxx}呢?咱们来看一下freemarker是如何渲染一个list的?

<#list apiList as api> 
  ${api.apiName}   
</#list>

看到这,预计大家都懂了把?

就是说咱们有一个 apiList 汇合对象, apiList as api ,别名为 api ,进行遍历。 ${api.apiName} 就输入了apiName对应的属性的值。

看到这,咱们的下面的模板,就很好了解了把?那咱们来另存为xml。

2.2 .xml改.ftl

应用idea关上.ftl,而后格式化一下,搜寻一下 ${api.apiName}

这里要留神一下,可能会有些中央报错,例如上面:

对于这些内容,咱们改一下即可。

参考 ${api.apiName} 的格局即可。

好了,这里会有个问题,咱们并没有看到有渲染一个list汇合的?那这里,咱们只能本人去结构了。

找到所有须要动静list渲染的内容,而后再加上 <#list > 标签

看到这里,预计大家都晓得怎么改 .ftl 模板了吧?这里就不在一一列举了。

2.3 freemarker渲染

  • 如果是应用springboot,那咱们的pom.xml文件,能够增加上面的依赖:

    <!-- freemarker-starter -->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>2.3.12.RELEASE</version>
    </dependency>

当然,间接引入fremarker依赖也是能够的,例如上面:

<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.31</version>
</dependency>
  • 代码实现

    @Autowired
    private Configuration configuration;
    
    @GetMapping("/doExportApiDoc2Word")
    public void doExportApiDoc2Word(HttpServletResponse response,
                                @ApiParam @RequestParam(value = "projectId") String projectId){
    try {
        //返回word文档
        String fileName = URLEncoder.encode("接口文档" + DateUtil.format(new Date(), "yyyyMMddHHmmss"), "UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.addHeader("Content-Disposition", "attachment; filename="" + fileName + ".docx"");
    
        //获取apiDoc所须要的数据
        Map<String, Object> dataModel = llsydnService.getApiDocData(projectId);
    
        //加载模板
        Template template = configuration.getTemplate("apiDoc.ftl", "utf-8");
        //渲染模板
        template.process(dataModel, response.getWriter());
        //response的Writer不须要咱们手动关,tomcat会帮咱们关的
    } catch (Exception e) {
        log.error("导出word异样:", e);
    }
    }

由上可见,基本上都不须要咱们操作,咱们只须要结构出对象的数据,传给freemarker引擎即可。

咱们要做的,就是定义好 .ftl 模板,结构好所需的参数。

这里阐明一下,这个 apiDoc.ftl 模板,咱们默认是放在templates目录上面即可,例如上面:

2.4 导出word

好了,咱们测试一下,浏览器间接拜访: http://localhost:8080/doExportApiDoc2Word?projectId=1

由此可见,导出的成果,还是蛮好的。

嘿,性能也实现了,我真是个聪慧的小伙!!!^_^

明天,又是空虚的一天!!!

哎呀,一股风吹过,头顶不禁有点凉意。

啥状况? 我的头发呢?(低微)

好了,以上就是 freemarker实现word文档模板动静生成 的分享了。

集体实操可能也不够全面,班门弄斧了。

如果感觉有播种的,帮忙 点赞、评论、珍藏 一下呗!!!

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理