携手创作,独特成长!这是我参加「掘金日新打算 · 8 月更文挑战」的第 29 天,点击查看流动详情
1. 写在后面
很多时候,咱们可能须要依据一个 word 模板,动静生成,咱们所须要得一个 word 文档。
那这里,通过 word 模板生成 word 文档,我之前写过一个案例:word 模板数据填充并转 pdf
这个案例得 word 模板,有什么弊病呢?咱们来看一下这个 word 模板,格局如下:
这样得一个 word 模板,我之前得做法是 替换段落文本
,那会有啥问题?
- 文本的格局可能会失落。
- 替换内容标识,可能会读取不到 (单词别隔开)。
- 无奈动静循环输入一个 list 汇合。
- 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 文档模板动静生成 的分享了。
集体实操可能也不够全面,班门弄斧了。
如果感觉有播种的,帮忙 点赞、评论、珍藏
一下呗!!!