springboot使用freemarker导出word

news2024/9/21 4:29:07

springboot使用freemarker导出word

  • 一、需求说明
  • 二、制作模板文件
    • 1.修改word留下占位符并另存为.xml文件
    • 2.将xml文件后缀名改为.ftl
    • 3.打开ftl文件格式化内容
    • 4.将占位符替换成变量
  • 三、代码实现
    • 1.引入依赖
    • 2.将模板引入resource下
    • 3.编写word导出工具包
    • 4.创建接口调用

一、需求说明

需要达到如下效果:根据需求导出word文档,在模板中渲染不通的参数图片
在这里插入图片描述

二、制作模板文件

1.修改word留下占位符并另存为.xml文件

此处我的占位符为username
在这里插入图片描述

在这里插入图片描述

2.将xml文件后缀名改为.ftl

在这里插入图片描述

3.打开ftl文件格式化内容

格式化地址:http://www.bejson.com/otherformat/xmlsort
在这里插入图片描述

4.将占位符替换成变量

需要会使用freemarker语法
将占位符替换成freemarker变量
在这里插入图片描述

三、代码实现

1.引入依赖

自行更改自己的依赖版本

<!--freemarker使用start-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--freemarker使用end-->

2.将模板引入resource下

在这里插入图片描述

3.编写word导出工具包

import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.Map;
import java.util.UUID;

/**
 * word导出工具
 */
@Slf4j
public class WordUtils {
    private static Configuration configuration = null;//配置

    private static  String templateFolder;

    static {
        templateFolder = WordUtils.class.getResource("/templates").getPath();
        configuration = new Configuration();
        configuration.setDefaultEncoding("utf-8");
        try {
            log.info("模板配置路径:" + templateFolder);
            configuration.setDirectoryForTemplateLoading(new File(templateFolder));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private WordUtils() {
        throw new AssertionError();
    }

    /**
     * 导出word
     *
     * @param request
     * @param response
     * @param map      参数
     * @param wordName 模板名,示例xxx.ftl
     * @param fileName 要到处的word文件名称,示例:test.doc
     * @throws IOException
     */
    public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String wordName, String fileName) throws IOException {
        Template freemarkerTemplate = configuration.getTemplate(wordName);
        File file = null;
        InputStream fin = null;
        ServletOutputStream out = null;
        String uuName=UUID.randomUUID().toString();
        try {
            // 调用createDoc方法生成Word文档
            file = createDoc(map, freemarkerTemplate, uuName);
            fin = new FileInputStream(file);
            response.setCharacterEncoding("utf-8");
            response.setContentType("application/x-download");
            fileName = new String(fileName.getBytes(), "ISO-8859-1");
            response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(fileName)));
            out = response.getOutputStream();
            byte[] buffer = new byte[512];// 缓冲区
            int bytesToRead = -1;
            // 通过循环将读入的Word文件的内容输出到浏览器中
            while ((bytesToRead = fin.read(buffer)) != -1) {
                out.write(buffer, 0, bytesToRead);
            }
        } finally {
            if (fin != null) fin.close();
            if (out != null) out.close();
            if (file != null) file.delete();// 删除临时文件
        }
    }

    private static File createDoc(Map<?, ?> dataMap, Template template, String name) {
        File f = new File(name);
        Template t = template;
        try {
            //这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");
            t.process(dataMap, w);
            w.close();
        } catch (Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
        return f;
    }
}

4.创建接口调用

/**
 * 打印导出
 * @param dclx 导出类型:zhdy桌号打印、dzddy对照单打印、zkzdy准考证打印
 */
@RequestMapping(value = "xxxxxForWord")
public void xxxxxForWord(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws IOException {
		//封装word需要的数据
        Map<String, Object> map = new HashMap<>();
        map.put("teachers",list);
        //模板名
        String wordName="teacher.ftl";
        //导出文件名
        String fileName="invite_teacher_"+System.currentTimeMillis()+".doc";
        WordUtils.exportMillCertificateWord(request, response, map, wordName, fileName);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1005631.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

eslint写jsx报错

eslint写jsx报错 ChatGPT提示 在写JSX时&#xff0c;ESLint可能会报出一些语法错误&#xff0c;这些错误通常是由于ESLint默认配置中不支持JSX语法导致的。为了解决这些错误&#xff0c;我们需要在ESLint配置文件中启用对JSX语法的支持。 首先&#xff0c;需要安装eslint-pl…

100道基于Android毕业设计的选题题目,持续更新

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W,Csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 大家好&#xff0c;我是程序员徐师兄、今天给大家谈谈基于android的app开发毕设题目&#xff0c;以及基于an…

苹果数据恢复软件:Omni Recover Mac

Omni Recover是一款十分实用的Mac数据恢复软件&#xff0c;为用户提供了简单、安全、快速和高效的数据恢复服务。如果您遇到了Mac或iOS设备中的数据丢失和误删情况&#xff0c;不要着急&#xff0c;不妨尝试一下Omni Recover&#xff0c;相信它一定会给您带来惊喜。 首先&…

【Bun1.0】使用 Bun.js 构建快速、可靠和安全的 JavaScript 应用程序

bun.js Bun 是一个现代的JavaScript运行环境&#xff0c;如Node, Deno。主要特性如下: 启动速度快。更高的性能。完整的工具&#xff08;打包器、转码器、包管理&#xff09;。 官网 https://bun.sh 优点 与传统的 Node.js 不同&#xff0c;Bun.js 提供了一些新的特性和功…

第8章_freeRTOS入门与工程实践之内存管理

本教程基于韦东山百问网出的 DShanMCU-F103开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id724601559592 配套资料获取&#xff1a;https://rtos.100ask.net/zh/freeRTOS/DShanMCU-F103 freeRTOS系列教程之freeRTOS入…

《Linkerd 2.0:下一代服务网格的探索》

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

C++下基于模拟退火算法解决TSP问题

一、原理 首先明确TSP问题的目标是什么&#xff0c;假设当前有3个城市&#xff0c;需要你从第一个城市开始&#xff0c;遍历所有城市&#xff0c;然后回到初始位置&#xff0c;要求总路径最短。这个时候就需要计算每个城市之间的两两距离&#xff0c;然后按顺序确定一条最短路…

【Unity】2D 对话模块的实现

对话模块主要参考 【Unity教程】剧情对话系统 实现。 在这次模块的构建将基于 unity ui 组件 和 C#代码实现一个从excel 文件中按照相应规则读取数据并展示的逻辑。这套代码不仅能实现正常的对话&#xff0c;也实现了对话中可以通过选择不同选项达到不同效果的分支对话功能。 …

机器视觉康耐视visionpro-CogFitLineTool拟合直线错误上的理解

视频详细解答&#xff1a;康耐视VisionPro高级脚本系列教程-2.拟合指教脚本遍历编写 什么是直线&#xff1f; 直线&#xff1a;那么直线是由无线的点组成的。特点是无端点&#xff1b;不能度量&#xff0c;两边无限延长。错误示例子如下&#xff1a; 首先上面是错误的理解&…

UG\NX CAM二次开发 设置工序切削区域 UF_CAMGEOM_append_items

文章作者:代工 来源网站:NX CAM二次开发专栏 简介: UG\NX CAM二次开发 设置工序切削区域 UF_CAMGEOM_append_items 效果: 代码: static int init_proc(UF_UI_selection_p_t select, void* user_data) { int errorCode = 0; int num_triples = 1;//UF_UI_mas…

来可LCWLAN-600P产品使用和常见问题说明

01LCWLAN-600P简介 LCWLAN-600P是来可电子最新生产的一款CAN转WiFi设备&#xff0c;该设备的主要功能是将CAN数据转换成网络数据并通过无线网络转发出去。设备支持8~30V宽压供电&#xff0c;出厂默认配置为AP模式&#xff0c;设备供电后可在电脑的WiFi搜索栏搜索到名称为LCWLA…

2023年意大利富时MIB指数研究报告

第一章 指数概况 1.1 指数基本情况 富时MIB指数&#xff08;意大利语&#xff1a;Financial Times Stock Exchange Milano Indice di Borsa, FTSE MIB&#xff09;&#xff0c;2009年6月之前称为S&P/MIB&#xff0c;是意大利证券交易所的基准股票市场指数。该指数于2004年…

[其他]IDEA中Maven项目配置国内源

配置国内源主要解决了,在maven项目中pom.xml下载jar包失败或过慢的问题. 在IDEA中的设置分成两种,设置当前项目与新创项目. 我们就需要两种都进行设置,不然只有在当前项目配置了国内源,新创项目的时候还是默认的状态. 由于下面两种设置的界面与方法是一致的,下面以当前项目设…

jmeter采集ELK平台海量业务日志( 采用Scroll)

由于性能测试需要&#xff0c;需采集某业务系统海量日志&#xff08;百万以上&#xff09;来使用&#xff0c;做稳定性压测使用。但Elasticsearch的结果分页size单次最大为10000&#xff08;运维同事为保证ES安全&#xff09;。为了能够快速采集ELK平台业务日志&#xff0c;可以…

Python解释器和Pycharm的傻瓜式安装部署

给我家憨憨写的python教程 有惊喜等你找噢 ——雁丘 Python解释器Pycharm的安装部署 关于本专栏一 Python解释器1.1 使用命令提示符编写Python程序1.2 用记事本编写Python程序 二 Pycharm的安装三 Pycharm的部署四 Pycharm基础使用技巧4.1 修改主题颜色4.2 修改字体4.3 快速修…

# (1462. 课程表 IV leetcode)广搜+拓扑-------------------Java实现

&#xff08;1462. 课程表 IV leetcode&#xff09;广搜拓扑-------------------Java实现 题目表述 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你想…

【Fiddler】mac m1 机器上使用 fiddler 抓取接口

mac m1 机器上使用 fiddler 抓取接口&#xff08;非虚拟机模式&#xff09; author: jwensh date:2023.09.12 文章目录 mac m1 机器上使用 fiddler 抓取接口&#xff08;非虚拟机模式&#xff09;1. 环境准备2. 进行配置3. 使用情况 1. 环境准备 想要抓取 mac 上浏览器的接口&a…

香橙派配合IIC驱动OLED 使用SourceInsight解读源码

OLED屏幕介绍 & 硬件接线 OLED也是老熟人了&#xff0c;详细的介绍见&#xff1a; IIC 协议 和 OLED_iic oled-CSDN博客 再次回顾香橙派硬件接线&#xff1a; 根据之前的学习了解到&#xff0c;OLED屏幕的驱动是需要IIC协议的&#xff0c;在学习C52时我使用了代码模拟IIC协…

C++之map如何实例化类对象(一百九十九)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

总结 NAT 机制的工作流程及优缺点

什么是NAT NAT定义 **NAT&#xff08;Network Address Translator&#xff0c;网络地址转换&#xff09;**是用于在本地网络中使用私有地址,在连接互联网时转而使用全局IP地址的技术. 实际上是为解决IPv4地址短缺而开发的技术: NAT技术作为当前解决IP地址不够用的主要手段&a…