freemarker实现word文档模板动态生成

2023-05-16

携手创作,共同成长!这是我参与「掘金日新计划 · 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文档模板动态生成 的分享了。

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

如果觉得有收获的,帮忙 点赞、评论、收藏 一下呗!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

freemarker实现word文档模板动态生成 的相关文章

随机推荐

  • (二)为AI和机器学习创建Docker容器

    目录 介绍 基本镜像 创建Dockerfile 构建镜像 运行容器 总结 下载源文件 154 4 KB 介绍 Docker 等容器技术显着简化了软件的依赖管理和可移植性 在本系列文章中 xff0c 我们探讨了 Docker 在机器学习 ML
  • 自定义EF Core迁移历史记录表

    目录 背景 更改表名称和架构 更改列名称 添加具有默认值的列 添加必填列 关于代码示例 引用 下载源代码 13 9 KB 背景 实体框架核心通过在名为 EFMigrationsHistory 和架构 dbo 的表中添加日志来跟踪应用的迁移
  • 使用EF Core 6执行原始SQL查询

    目录 背景 现有选项 ExecuteSqlRaw 插入 更新 删除 FromSqlRaw FromSqlInterpolated 自定义数据库上下文扩展方法 ExecuteScalar ExecuteNonQuery FromSqlQuer
  • 仓库更新了,git pull拉取远端失败

    仓库更新了 span class token punctuation span git pull拉取远端失败 span class token operator span error span class token operator sp
  • xPath 用法总结整理

    最近在研究kafka xff0c 看了一堆理论的东西 xff0c 想动手实践一些东西 xff0c 奈何手上的数据比较少 xff0c 突发奇想就打算写个爬虫去抓一些数据来玩 xff0c 顺便把深入一下爬虫技术 之前写过一些小爬虫 xff0c
  • vi编辑器

    目录 简介 基本操作 1 移动光标 2 定位 3 删除 4 复制 5 查找
  • 使用libevent搭建简单http服务器

    64 使用libevent搭建简单http服务器 一 libevent 的下载 可通过官网直接进行下载libevent库 xff1b 例子使用的是V2 1 1版本 xff0c 下载完成后 xff0c 解压 xff1b 可以再解压目录下获取
  • C++动态链接库中的全局变量面试题

    其实主要问题是三个模块 xff1a 模块 a 静态库 a 模块 b 二进制 b 静态引用a 动态加载c 模块 c 动态链接库c 静态引用a 关键在于静态库a里有一个静态全局变量 xff0c 没错就是我们的日志模块 原先的这个静态的模块中的静
  • Linux 桌面修改文件mime类型图标

    在多数的Linux发行版中 xff0c 默认的桌面的文件类型图标着实不好看 xff0c 比如我常用的Linux之一Debian xff0c 默认文件类型图标就很不好看 如果我们自定义了一种mime类型的话肯定也是没有图标的啦 xff0c 下
  • 比 MyBatis 快了 100 倍

    比 MyBatis 效率快 100 倍的条件检索引擎 xff0c 天生支持联表 xff0c 使一行代码实现复杂列表检索成为可能 xff01 2开源协议 使用Apache 2 0开源协议 3界面展示 你的产品给你画了以上一张图 xff0c 还
  • 【GIT】GIT基础教程(新手必看)

    准备工作 1 首先要下载git xff0c git官网下载比较缓慢 xff0c 这里提供一个淘宝镜像的网站 https npm taobao org mirrors git for windows 里边有各种版本的git xff0c 选择与
  • Python常见内置类属性介绍

    文章目录 64 TOC 文章目录 什么是内置类属性一 dict 的用法二 name 的用法三 file 的用法 什么是内置类属性 当python创建一个类之后 xff0c 系统就自带了一些属性 xff0c 叫内置类属性 这些属性名用双下划线
  • win32应用程序和win32控制台应用程序

    win32应用程序是有窗体的 xff08 当然也可以没有 xff09 xff0c 有Windows消息循环机制的 而win32控制台应用程序只是在控制台下运行的程序 xff0c 类似以前dos的程序 Win32 Application和Wi
  • springBoot 启动指定配置文件环境多种方案

    springBoot 启动指定配置文件环境理论上是有多种方案的 xff0c 一般都是结合我们的实际业务选择不同的方案 xff0c 比如 xff0c 有pom xml文件指定 maven命令行指定 配置文件指定 启动jar包时指定等方案 xf
  • tigervnc黑屏及mate-session缺失

    1 项目信息 host os xff1a Kylin Server V10 arm64 2022 04 29 2 问题描述及原因分析 通过一下命令安装vnc server yum install tigervnc server 然后通过vn
  • (Java)集合工具类:Collections

    文章目录 一 Collections 简介二 Collections 操作实例1 实例操作一 xff1a 返回不可变的集合2 实例操作二 xff1a 为集合增加内容3 实例操作三 xff1a 反转集合中的内容4 实例操作四 xff1a 检索
  • Seata快速开始

    Seata分TC TM和RM三个角色 xff0c TC xff08 Server端 xff09 为单独服务端部署 xff0c TM和RM xff08 Client端 xff09 由业务系统集成 Seata Server 部署 步骤一 xff
  • 点击Anaconda中的Jupyter Notebook无法打开浏览器

    解决方法一 xff1a 通过修改配置文件来指定浏览器打开notebook 步骤 xff1a 打开anaconda promote 输入 xff1a jupyter notebook generate config 输出结果 xff1a Wr
  • 深度学习——入门经典案例《波士顿房价预测》深度解析

    一 深度学习 机器学习算法理论在上个世纪90年代发展成熟 xff0c 在许多领域都取得了成功应用 但平静的日子只延续到2010年左右 xff0c 随着大数据的涌现和计算机算力提升 xff0c 深度学习模型异军突起 xff0c 极大改变了机器
  • freemarker实现word文档模板动态生成

    携手创作 xff0c 共同成长 xff01 这是我参与 掘金日新计划 8 月更文挑战 的第29天 xff0c 点击查看活动详情 1 写在前面 很多时候 xff0c 我们可能需要根据一个word模板 xff0c 动态生成 xff0c 我们所需