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

4次阅读

共计 2734 个字符,预计需要花费 7 分钟才能阅读完成。

携手创作,独特成长!这是我参加「掘金日新打算 · 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 文档模板动静生成 的分享了。

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

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

正文完
 0