Java学习:使用Freemarker导出简单的Word文档

2023-11-13

一、准备工作

  1. 准备想要导出的word文档的模板

  2. 准备maven的依赖

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.29</version>
</dependency>

二、开始写导出Word的功能接口

  1. 将Word文档转换为xml,直接另存为xml即可
    在这里插入图片描述

  2. 然后将文件的后缀名修改为ftl

    word模板.xml ---->> word模板.ftl
    

    在这里插入图片描述

  3. 将ftl文件中你需要替换的数据使用${变量名}进行替换,也可以直接在word文档中直接写然后再转换。

    比如有一段话是
    小明今年9岁。
    你想使用不同的人名和年纪来替换,可以这样:
    ${name}今年${age}岁。
    这个可以在ftl文件中修改,也可以直接在word文档中这样写
    
    

    在这里插入图片描述
    我不推荐这样,这次我这样写出错了,我还是建议先生成ftl文件然后去手动改。生成的ftl文件会没格式化,去格式化一下即可)
    在这里插入图片描述

  4. 然后将ftl放到项目的指定路径下,我就放到了resource的word目录下
    在这里插入图片描述

  5. 写接口代码

@RequestMapping("/export-word")
    public Result exportWord(){
        //这个是生成文件的文件名
        String fileName = "" + DateUtils.format( new Date(),"yyyyMMddHHmmssSSS") + ".doc";
        Writer out = null;
        OutputStream outputStream = null;
        try {
            //拼接生成文件的全路径
            String downloadPath = download + fileName;
            File desc = new File(downloadPath);
            //判断目录是否存在,不存在则创建
            if (!desc.getParentFile().exists()) {
                desc.getParentFile().mkdirs();
            }
            //创建输出流
            outputStream = new FileOutputStream(downloadPath);
            out = new BufferedWriter(new OutputStreamWriter(outputStream, "utf-8"), 10240);
            //这里面存放需要替换的数据
            Map<String, Object> data = new LinkedHashMap<>();
			//举个例子,放置假数据,这个data里面的数据将会根据key把value设置到文档中去替换${name},${age}
			data.put("name","小明");
            data.put("age","9");
            //创建Freemarker的Configuration对象
            Configuration configuration = new Configuration();
            //设置默认编码
            configuration.setDefaultEncoding("utf-8");
            configuration.setClassForTemplateLoading(this.getClass(), "/");
            //获取路径下的模板,这个ftl是Word文档转换过来的
            Template t = configuration.getTemplate("word/word模板.ftl", "utf-8");

            log.info("开始导出word中.....");
            t.process(data, out);

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                //关闭输出流
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return Result.ok(fileName);
        }
    }
  1. 访问接口即可,去指定路径下找到输出的文件
    在这里插入图片描述

三、补充
这只是简单的模板导出,如果有表格的话,只需要在代码中的data中塞入一个需要遍历的列表数据

data.put("列表的变量名字",列表变量名字);

然后在ftl中使用

<#list 列表的变量名字 as 单条的自定义数据变量名称></#list>
例如:<#list employees as employee ></#list>

你的表格中的标签

<w:tbl> 
	<w:tr> 
		<w:tc></w:tc>
	</w:tr>
</w:tbl>
-------------------
<w:tbl>表格标签类似HTML的<table><w:tr>类似HTML的<tr><w:tc></w:tc>每一个单元格

使用employee中的属性名将其替换即可,适用多个员工列表数据做成表格

注意:这只是个简单的样子,还是得根据真实的转换结果来修改

<#list employees as employee >
	<w:tbl> 
		<w:tr> 
			<w:tc>${employee.name}</w:tc>
			<w:tc>${employee.age}</w:tc>
			<w:tc>${employee.dept}</w:tc>
			<w:tc>${employee.cardId}</w:tc>
		</w:tr>
	</w:tbl>
</#list>

以上就是使用Freemarker导出简单的Word文档的全部内容

新手上路,加个关注

欢迎交流

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

Java学习:使用Freemarker导出简单的Word文档 的相关文章

随机推荐

  • 我遇到的DSO missing from command line

    首先 使用C 代码编译了一个静态链接库libmy a 然后在另外一个C语言的项目中去调用此静态库 结果出现如下错误 usr bin ld libmy a message mm o undefined reference to symbol
  • Axure8下载和安装

    1 axureRP 和墨刀的选择 原型图工具有axure 墨刀 摩客 Mockplus xiaopiu Sketch等 其中现在最常用的原型图工具主要包括axure和墨刀 axure作为老牌的原型图工具 功能最齐全 交互最多样 基本任何想要
  • 【从零开始的Java开发】2-9-1 JavaScript入门:语法、JS对表单元进行设置、事件与DOM

    文章目录 页面使用JS的方法 相关语法 变量 调试 自定义函数 数据类型及类型转换 变量作用域 运算符 程序控制语句 内置函数 数组 JS对表单元进行设置 单击与刷新 单选按钮 列表框 列表框 刷新后默认选中间的值 与 修改对应月份的日期
  • 以太坊智能合约设计模式

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 设计模式是许多开发场景中的首选解决方案 本文将介绍五种经典的以太坊智能合约设计模式并给出以太坊solidity实现代码 自毁合约 工厂合约 名称注册表 映射表迭代器和提款模
  • Fashion MNIST 图片重建与生成(VAE)

    前面只能利用AE来重建图片 不是生成图片 这里利用VAE模型完成图片的重建与生成 一 数据集的加载以及预处理 加载Fashion MNIST数据集 x train y train x test y test keras datasets f
  • Java从入门到精通!mysql控制台输入密码闪退

    Redis简介 Redis与Memcached区别 Redis优点 Redis缺点 Redis数据类型 String Hash List Set Sorted set Redis事务 MULTI EXEC 原子执行 并非互斥 WATCH U
  • 【报错】在nginx下启动,登录成功后页面不跳转

    报错 在nginx下启动 登录成功后页面不跳转 分析 先检查是nginx的错误还是代码的错误 如果是nginx的错误 则其他部署在其上的项目也无法进行登入 但是一般不会出现这种情况 如果是代码的错误 先检查登录页 登录跳转做了什么样的判断
  • 2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书

    2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书 2023年自治区职业院校技能大赛暨全国职业院校技能大赛新疆选拔赛任务书 A模块基础设施设置 安全加固 200分 A 1 登录安全加固 Windows Linux A 2
  • Ubuntu16.04编译Linux内核

    本文介绍在Ubuntu中编译Linux内核并添加新的启动项信息 第一步 下载内核源码并解压 内核源码可以在官网下载 点击打开链接 笔者用的内核版本是4 14的 把下载好的内核源码放在 usr src kernel目录下 没有这个目录的话可以
  • DR数字成像平板探测器的主要特性

    平板探测器是DR和CT的核心部件 其性能对图像质量影响很大 随着市面上探测器的品牌和型号越来越丰富 价格也是有高有低 让人挑起来眼花缭乱 下面整理了一些探测器的主要特性及简单分析 希望对大家在数字成像中探测器的选型有所帮助 实时成像中动态图
  • 深度之眼(十)——矩阵特征值与特征向量

  • 机器学习算法系列(二十一)-k近邻算法(k-Nearest Neighbor / kNN Algorithm)

    阅读本文需要的背景知识点 一丢丢编程知识 一 引言 前面一节我们学习了机器学习算法系列 二十 梯度提升决策树算法 Gradient Boosted Decision Trees GBDT 是一种集成学习的算法 这一节我们来学习一个相对简单直
  • Python 3.6打包成EXE可执行程序

    Python 3 6打包成EXE可执行程序 下载pyinstaller python 3 6 已经自己安装了pip 所以只需要执行 pip install pyinstaller就可以了 打包程序 进入到你你需要打包的目录 比如我在H xc
  • python爬虫工程师面经(2023年金三银四)

    python爬虫工程师面经 前言 面经总结 发展相关问题 爬虫基础相关问题 工作经验相关问题 总结 前言 过年期间 经过自我慎重的考虑后 终于决定在2月份向公司提出了辞职 说实话很慌 也做好了长时间找不到工作的准备 只是继续呆在公司对自我发
  • 用Kettle实现转换和作业例子

    一 转换 双击Kettle目录下的Spoon bat脚本 启动Kettle工具 在工具栏处选择 文件 新建 转换 命令 创建一个转换 名称默认是 转换1 选择 文件 保存 命令 可以对转换进行重命名以及选择转换保存路径 重命名为exampl
  • Java多线程-线程池ThreadPoolExecutor的submit返回值Future

    一般使用线程池执行任务都是调用的execute方法 这个方法定义在Executor接口中 public interface Executor void execute Runnable command 1 2 3 这个方法是没有返回值的 而
  • 微信企业号的基本配置流程(新手,勿喷!)

    一 登录微信公众号 确认登录的公众号为企业认证 二 打开开发里面的基本配置 如图 三 根据你的项目后台微信配置里面需要的数据 来在微信公众号的后台找到 然后 一一对应的写入你的项目后台的微信配置 如图 这是我的项目后台微信配置 四 按照自己
  • 《统计学习方法》学习笔记(一):概论

    统计学习方法三要素 模型 策略和算法 策略是想要最优解 模型给定输入 训练 得到输出 算法处理信息的方法 模型选择 正则化 交叉验证与学习泛化的能力 正则化 防止过拟合 简单来说是限制在规则之内 减小误差的行为 规则化 给需要训练的目标函数
  • Oracle的锁表与解锁

    Oracle的锁表与解锁 SELECT rule s username decode l type TM TABLE LOCK TX ROW LOCK NULL LOCK LEVEL o owner o object name o obje
  • Java学习:使用Freemarker导出简单的Word文档

    一 准备工作 准备想要导出的word文档的模板 准备maven的依赖