使用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;}

效果图展示:

 若本文对你有所帮助,请一键三连,就是对我最好的支持。

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

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

相关文章

如何隐藏开源流媒体EasyPlayer.js视频H.265播放器的实时录像按钮?

目前我们TSINGSEE青犀视频所有的视频监控平台&#xff0c;集成的都是EasyPlayer.js版播放器&#xff0c;它属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;包括WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#x…

Windows安装JDK和JRE的方法

原文网址&#xff1a;Windows安装JDK和JRE的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Windows安装JDK和JRE&#xff08;Java8&#xff09;的方法。 下载 下载入口&#xff1a;https://www.oracle.com/java/technologies/javase/javase8-archive-downloads.html jdk-8…

计算机网络(2) --- 网络套接字UDP

计算机网络&#xff08;1&#xff09; --- 网络介绍_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131967378?spm1001.2014.3001.5501 目录 1.端口号 2.TCP与UDP协议 1.TCP协议介绍 1.TCP协议 2.UDP协议 3.理解 2.网络字节序 发送逻辑…

Ansible之playbook剧本编写

一、playbook的相关知识 1.playbook简介 playbook是 一个不同于使用Ansible命令行执行方式的模式&#xff0c;其功能更强大灵活。简单来说&#xff0c;playbook是一个非常简单的配置管理和多主机部署系统&#xff0c;不同于任何已经存在的模式&#xff0c;可作为一个适合部署复…

Azure pipeline自动化打包发布

pipeline自动化&#xff0c;提交代码后&#xff0c;就自动打包&#xff0c;打包成功后自动发布 第一步 pipeline提交代码后&#xff0c;自动打包。 1 在Repos,分支里选择要触发的分支&#xff0c;这里选择cn_china,对该分支设置分支策略 2 在生产验证中增加新的策略 3 在分支安…

基于STM32103移植FreeRTOS

目录 一、FreeRTOS协议栈下载 二、准备工程文件与协议代码 三、移植FreeRTOS协议栈 一、FreeRTOS协议栈下载 1、官网下载 FreeRTOS - Market leading RTOS (Real Time Operating System) for embedded systems with Internet of Things extensionshttps://www.freertos.or…

“Why Should I Trust You?” Explaining the Predictions of Any Classifier阅读笔记

“Why Should I Trust You?” Explaining the Predictions of Any Classifier阅读笔记 1. 论文贡献2. 背景 [ 1 ] ^{[1]} [1]3. LIME解释单个样本3.1 总体思想3.2 构建可解释的数据表示 [ 1 ] ^{[1]} [1]3.3 可解释性和忠实度的权衡3.4 局部采样3.5 稀疏线性解释3.6 使用SVM进…

无人机航测技术有何特点?主要应用在哪些方面?

无人机航测是航空摄影测量的一种&#xff0c;主要面向低空遥感领域&#xff0c;具有成本低、快速高效、适用范围广等特点。目前&#xff0c;无人机航测主要应用于地形测绘、城市数字化建设、工程建设等方面。 无人机航测技术的特点 1、作业成本低 传统的人工测量技术主要利用…

2023 年牛客多校第六场题解

A Tree 题意&#xff1a;给定 n n n 个点的一棵边带权的树&#xff0c;点有黑白二色&#xff08; 0 , 1 0,1 0,1 表示&#xff09;&#xff0c;现在可以以 a i a_i ai​ 的价值翻转第 i i i 个点的颜色&#xff0c;一对异色点 ( u , v ) (u,v) (u,v) 的价值为树上路径的最…

视频监控汇聚平台EasyCVR视频分享页面WebRTC流地址播放不了是什么原因?

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;在视频监控播放上&#xff0c;TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放&#xff0c;可同时播放多…

AI绘图实战(十二):让AI设计LOGO/图标/标识 | Stable Diffusion成为设计师生产力工具

S&#xff1a;AI能取代设计师么&#xff1f; I &#xff1a;至少在设计行业&#xff0c;目前AI扮演的主要角色还是超级工具&#xff0c;要顶替&#xff1f;除非甲方对设计效果无所畏惧~~ 预先学习&#xff1a; 安装及其问题解决参考&#xff1a;《Windows安装Stable Diffusion …

百度UEditor编辑器如何关闭抓取远程图片功能

百度UEditor编辑器如何关闭抓取远程图片功能 这个坑娘的功能&#xff0c;开始时居然不知道如何触发&#xff0c;以为有个按钮&#xff0c;点击一下触发&#xff0c;翻阅了文档&#xff0c;没有发现&#xff0c;然后再网络上看到原来是复制粘贴非白名单内的图片到编辑框时触发&a…

华为数通HCIA-华为VRP系统基础

什么是VRP? VRP是华为公司数据通信产品的通用操作系统平台&#xff0c;作为华为公司从低端到核心的全系列路由器、以太网交换机、业务网关等产品的软件核心引擎。 VRP提供以下功能&#xff1a; 实现统一的用户界面和管理界面 实现控制平面功能&#xff0c;并定义转发平面接口…

[数据集][目标检测]遛狗不牵绳数据集VOC格式-1980张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1980 标注数量(xml文件个数)&#xff1a;1980 标注类别数&#xff1a;5 标注类别名称:["dog","p…

yo!这里是STL::vector类简单模拟实现

目录 前言 重要接口模拟实现 默认成员函数 1.构造函数 2.析构函数 3.拷贝构造函数 4.赋值运算符重载 迭代器 简单接口 1.size() 2.capacity() 3.swap() 操作符重载 1.操作符[] 扩容接口 1.reserve() 2.resize() 增删查改接口 1.push_back() 2.pop_back() …

大数据Flink(五十五):Flink架构体系

文章目录 Flink架构体系 一、 Flink中的重要角色 二、Flink数据流编程模型 三、Libraries支持

Flutter Flar动画实战

在Flare动面出现之前,Flare动画大体可以分为使用AnimationController控制的基础动画以及使用Hero的转场动画,如果遇到一些复杂的场景,使用这些动画方案实现起来还是有难度的。不过,随着Flutter开始支持Flare矢量动面,Flutter的动画开发也变得越来越简单。事实上,Flare动画…

实现天气预报走势图

实现效果&#xff1a; 这里我用的天气接口是网上开源的&#xff0c;可以自己找一下。 稍微简单封装了一下axiso以及接口 封装的axios&#xff1a; // import { useUserStore } from /stores/user import axios from axios import router from /router import { ElMessage } f…

9 多进程编程

文章目录 进程以及状态进程进程的状态linux下的进程管理pstopbgkillcrontab 进程的创建两个while同时运行示例获取进程pidProcess 结构给子进程指定的函数传递参数进程间是否共享全局变量补充 进程间通信-Queue常用操作Queue 实例 管道通信&#xff08;了解&#xff09;样例 进…

问题:idea启动项目错误提示【command line is too long. shorten command line】

问题&#xff1a;idea启动项目错误提示【command line is too long. shorten command line】 参考博客 问题描述 启动参数过长&#xff0c;启动项目&#xff0c;错误提示 原因分析 出现此问题的直接原因是&#xff1a;IDEA集成开发环境运行你的“源码”的时候&#xff08…