使用FreeMarker导出word文档(支持导出图片)
今天跟大家分享一下工作中比较实用的导出word 带图片的功能。
对于在idea开发中我们需要引入以下依赖:

2.对于eclipse 开发我们需要进入对应的jar包

这个必须放在lib下,同样也需要在当前项目的环境是加入该依赖

需要在MEAT-INF加入

首先制定word 导出模版格式,用占位符进行代替

对于插入的图片提前设置好大小格式
编写好后:进行另存为 html 格式或者xml

接着用编辑文本打开修改里面的内容

对于插入图片的时候请注意:在src 的时候也用占位符。

注意:所有的占位符要与代码中的Hashmap 中的key,保持一致。
编写代码:
@RequestMapping(value = "/exportWord")public void exportWord(HttpServletRequest request, HttpServletResponse response, @RequestParam(value = "id") String id ) throws Exception{List<Map<String, Object>> list = new ArrayList<Map<String,Object>>();ArrayList<String> parameters = new ArrayList<String>();List<Map<String,Object>> queryResult2 = limitspaceworkBizc.findyxkjzydc(id);if(queryResult2.size()>0){list.add(queryResult2.get(0));}Map<String, Object> query = list.get(0);exportWord(request, response, query, "明细表.docx",id);}public void exportWord(HttpServletRequest request,HttpServletResponse response, Map<String, Object> query, String fileName,String id) throws IOException, InvalidFormatException {//获取 模版的路径String pathString = request.getSession().getServletContext().getRealPath("/WEB-INF/templete/");System.out.println("获取到的模板路径是:templetePath------->" + pathString);Configuration configuration = new Configuration(new Version("2.3.23"));configuration.setDefaultEncoding("utf-8");configuration.setDirectoryForTemplateLoading(new File(pathString));Template freemarkerTemplate = configuration.getTemplate("yxkjzydmysd.ftl");File file = null;InputStream fin = null;ServletOutputStream out = null;try {String SPDimage =null;List<LimitSpaceWorkExportpo> vos = new ArrayList<LimitSpaceWorkExportpo>();LimitSpaceWorkExportpo aa= new LimitSpaceWorkExportpo();Map<String,Object> map3=limitspaceworkBizc.findrwtp(id);Map<String,Object> map = new HashMap<String,Object>();map.put("BH", query.get("BH")==null?"":query.get("BH").toString());map.put("ZCGLDW", query.get("ZCGLDW")==null?"":query.get("ZCGLDW").toString());map.put("SZDQ", query.get("SZDQ")==null?"":query.get("SZDQ").toString());map.put("ZYLX", query.get("ZYLX")==null?"":query.get("ZYLX").toString());map.put("ZYMC", query.get("ZYMC")==null?"":query.get("ZYMC").toString());map.put("GCXZ", query.get("GCXZ")==null?"":query.get("GCXZ").toString());map.put("GCZZDW", query.get("GCZZDW")==null?"":query.get("GCZZDW").toString());map.put("LXR", query.get("LXR")==null?"":query.get("LXR").toString());map.put("LXDH", query.get("LXDH")==null?"":query.get("LXDH").toString());map.put("ZYFW", query.get("ZYFW")==null?"":query.get("ZYFW").toString());map.put("ZYNR", query.get("ZYNR")==null?"":query.get("ZYNR").toString());map.put("ZYSQR", query.get("ZYSQR")==null?"":query.get("ZYSQR").toString());map.put("ZYDW", query.get("ZYDW")==null?"":query.get("ZYDW").toString());map.put("ZYSQRDH", query.get("ZYSQRDH")==null?"":query.get("ZYSQRDH").toString());map.put("XCFZR", query.get("XCFZR")==null?"":query.get("XCFZR").toString());map.put("XCFZRDH", query.get("XCFZRDH")==null?"":query.get("XCFZRDH").toString());map.put("AQXYS", map3.get("AQXYS")==null?"":map3.get("AQXYS").toString());map.put("SPD", map3.get("SPD")==null?"":map3.get("SPD").toString());map.put("CND", map3.get("CND")==null?"":map3.get("CND").toString());map.put("GZS", map3.get("GZS")==null?"":map3.get("GZS").toString());map.put("GJCX", map3.get("GJCX")==null?"":map3.get("GJCX").toString());// 调用工具类的createDoc方法生成Word文档file = createDoc(map,freemarkerTemplate);fin = new FileInputStream(file);response.setCharacterEncoding("utf-8");response.setContentType("application/msword");// 设置浏览器以下载的方式处理该文件名fileName = URLEncoder.encode("断面验收报告" + ".docx", "UTF-8");response.setHeader("Content-disposition", "attachment; filename="+ fileName + ";filename*=utf-8" + 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<String, Object> dataMap, Template template) {String name = ".doc";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;}
效果图展示:

若本文对你有所帮助,请一键三连,就是对我最好的支持。
相关文章:
使用FreeMarker导出word文档(支持导出图片)
今天跟大家分享一下工作中比较实用的导出word 带图片的功能。 对于在idea开发中我们需要引入以下依赖: 2.对于eclipse 开发我们需要进入对应的jar包 这个必须放在lib下,同样也需要在当前项目的环境是加入该依赖 需要在MEAT-INF加入 首先制定word 导出…...
C/C++中变量按位操作
一、按位写入1 uint32_t writeBit (1 << 5) // 第5位的掩码 uint32_t value 0x12341234; // 设置第5位为1 value | writeBit;原理就是原值与掩码… 00010000进行按位相与,与0相交的位还是等于原来的值,与1相交的位则变为1。 二、按位写入0…...
uni、css——制作表格样式的模型
案例展示 这里以5列做展示(可随意调节) 案例代码 <view class"list"><view class"item" v-for"(item,index) in list" :key"index">1</view> <!-- 有内容 --><view clas…...
mac前端代码编辑 Sublime Text 4 Dev 中文v4.0(4151)
Sublime Text 4 for Mac是一款功能强大的代码编辑器,适合所有需要高效编写代码和进行代码管理的程序员使用。 快速响应:Sublime Text 4在加载文件和执行命令时非常快速,能够让用户在高效的开发过程中体验到无缝的交互。 多种语言支持&#…...
面试之HashMap
1.什么是集合框架 Java的集合主要有两个根接口Collection和Map派生出来的,Collection派生出来了三个子接口:List,Queue,Set。因此Java集合大致可分为List,Queue,Set,Map四种体系结构。 2.HashMap与TreeMap HashMap是直接实现Map接口,而Tree…...
promethues mysql-rules
groups: - name: mysql.rules rules: - alert: MysqlDown expr: mysql_up 0 for: 1s labels: severity: critical annotations: title: MySQL down description: "Mysql实例: 【{{ $labels.instance }}】, MySQL instance is down…...
Maven项目中Lifecycle和Plugins下的install的区别
在Maven中,如果你的web和service在不同的模块下,如果直接用用tomcat插件运行web层,那么运行时会报错 Failed to execute goal org.apache.maven.plugins:maven-install-plugin:2.5.2:install (default-cli) on project springboot: The pack…...
02-状态模式
1 意图 允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。(这里的对象指的就是模型中的Context,行为指的就是State的子类) 2 动机 考虑一个问题:实现一个表示网络连接的类TCPConnection&am…...
Python异常处理中异常的种类有哪些?你知道几个?
前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 在python中不同的异常可以用不同的类型(python中统一了类与类别,类型即类)取标识,一个异常标识一种错误。 1.常见语法错误 AttributeError 试图访问一个对象没有的属性&#x…...
COBOL语言介绍及使用场景
COBOL(Common Business-Oriented Language)是一种面向业务的通用计算机编程语言,最初于1959年由美国国家标准学会(ANSI)开发。COBOL的设计目标是为了处理商业应用程序,尤其是大型企业级应用。本文将介绍COB…...
【计算机视觉 | 图像分割】arxiv 计算机视觉关于图像分割的学术速递(8 月 1 日论文合集)
文章目录 一、分割|语义相关(16篇)1.1 DPMix: Mixture of Depth and Point Cloud Video Experts for 4D Action Segmentation1.2 Investigating and Improving Latent Density Segmentation Models for Aleatoric Uncertainty Quantification in Medical Imaging1.3 Domain Ada…...
Jetson nano 安装swapfile 解决Cannot allocate memory 问题
在jetson nano上执行一些程序的时候,由于nano的内存只有4GB,因此可能会出现以下报错信息,例如:OSError:Cannot allocate memory 的问题。可以尝试用下面的方法解决:通过安装 swapfile,可以解决这个问题。 …...
ElasticsSearch基础概念和安装
ElasticSearch基础概念以及可视化界面安装 文章目录 ElasticSearch基础概念以及可视化界面安装1、引言2、基本概念3、倒排索引机制3.1、倒排索引 4、使用docker安装ElasticSearch4.1、下载镜像文件4.2 、创建实例,启动es 5.安装Kibana 1、引言 Elastic 的底层是开源库 Lucene。…...
【GEMM预备工作】行主序和列主序矩阵的内存中的连续性,解决理解问题
在内存存储中,默认矩阵是按照行优先储存的,即矩阵的每一列在内存中是连续的。行优先矩阵储存中行数据是不连续的。 而对于列主序的矩阵,是按照列优先储存的,即矩阵的每一行在内存中是连续的。列优先矩阵储存中列数据是不连续的&am…...
利用el-button 画圆 ,通过border-radius >50% 就成圆形
<el-button type"danger" style"border-radius: 100%; height: 100px;width: 100px;" plain><span style"font-weight: bold;">工艺分析</span></el-button>通过border-radius >50% 就成圆形。 border-radius: 50% …...
在tensorflow分布式训练过程中突然终止(终止)
问题 这是为那些将从服务器接收渐变的员工提供的培训功能,在计算权重和偏差后,将更新的渐变发送到服务器。代码如下: def train():"""Train CIFAR-10 for a number of steps."""g1 tf.Graph()with g1.as_de…...
windows永久暂停更新
目录 1.winr,输入regedit打开注册表 2.打开注册表的这个路径: 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings 右键空白地方新建QWORD值命名为:FlightSettingsMaxPauseDays 3.双击FlightSettingsMaxPauseDays,修改里面的值为100000,右边基数设置…...
Android 9系统源码_音频管理(一)按键音效源码解析
前言 当用户点击Android智能设备的按钮的时候,如果伴随有按键音效的话,会给用户更好的交互体验。本期我们将会结合Android系统源码来具体分析一下控件是如何发出按键音效的。 一、系统加载按键音效资源 1、在TV版的Android智能设备中,我们…...
PyTorch搭建神经网络
PyTorch版本:1.12.1PyTorch官方文档PyTorch中文文档 PyTorch中搭建并训练一个神经网络分为以下几步: 定义神经网络定义损失函数以及优化器训练:反向传播、梯度下降 下面以LeNet-5为例,搭建一个卷积神经网络用于手写数字识别。 …...
TiDB 优雅关闭
背景 今天使用tiup做实验的事后,将tidb节点从2个缩到1个,发现tiup返回成功但是tidb-server进程还在。 这就引发的我的好奇心,why? 实验复现 启动集群 #( 07/31/23 8:32下午 )( happyZBMAC-f298743e3 ):~/docker/tiup/tiproxy…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
