使用FreeMarker导出word文档(支持导出图片)

news2025/1/15 6:48:17

今天跟大家分享一下工作中比较实用的导出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.coloradmin.cn/o/830234.html

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

相关文章

动画响应卡

html代码: <div class"container"><div class"card" style"--clr: #009688"><div class"img-box"><img src"https://www.jq22.com/newjs/img-01.png"></div><div class"content&quo…

RabbitMQ 教程 | 第8章 跨越集群的界限

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

面试热题100(买卖股票的最佳时机)

为什么有人夜里碰到股票问题&#xff0c;辗转反侧睡不着觉&#xff1f;为什么有人看到股票问题心理欢喜直接操作&#xff1f;你是想做哪类人&#xff1f;今天就揭秘股票问题&#xff0c;让你应对股票问题的时候可以如鱼得水。 这种问题一看就是动态规划问题&#xff0c;动态规划…

导入了Junit依赖,但@Test注解依然爆红~

错误描述如下所示&#xff1a; 原因&#xff1a; 解决方法&#xff0c;将<scope>test</scope>删除&#xff0c;再如下所示重新构建项目&#xff1a;

MYSQL视图和mysql触发器(学会并使用day6)

MYSQL视图和mysql触发器 MYSQL视图使用视图的原因视图作用视图规则和限制视图的应用实际操作创建表并查看创建视图视图记录修改修改视图 mysql触发器创建触发器employee表employee02表创建一个触发器t1更新语句并查看employee02表删除触发器查询触发器触发器类型OLD和NEW MYSQL…

用户体验旅程图:改进用户体验的好工具

用户体验旅程图&#xff1a;改进用户体验的好工具 怎么改进体验&#xff0c;是有方法的 用户情绪曲线来衡量用户感觉 趣讲大白话&#xff1a;没有流程刨析&#xff0c;就没法改进 【趣讲信息科技245期】 **************************** 企业管理需要基本的流程的 企业流程简称BP…

“中国网安企业出海20强” | 赛宁网安持续领航国际市场

​​8月2日&#xff0c;斯元商业咨询机构基于对网安行业长期研究数据和公开调研&#xff0c;正式发布了「China’s Top 20 Cybersecurity Tech Going Global」&#xff08;「中国网络安全企业出海20强」&#xff09;研究报告&#xff08;以下简称TOP20报告&#xff09;。 “TO…

【MYSQL】MYSQL学习笔记【基础篇】【未完待续】

文章目录 MYSQL入门一、MYSQL概述1. 数据库相关概念1.1 数据库&#xff0c;数据库管理系统与SQL1.2 数据库种类以及主流数据库管理系统排名1.3 MySQL数据库安装1.4 数据模型 二、SQL2.1 通用语法与注释2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作2.3.2.1 表操作-查询创建2…

UIAutomator2安装及连接手机,我踩的坑都在这儿了

一、大致步骤 大家搜索网络教程&#xff0c;都会看到差不多的安装步骤&#xff1a; 1、本人使用的python3.11 2、OPPO手机 3、安装UIAutomator2&#xff1a; 在命令行中输入&#xff1a;pip install --pre uiautomator2 4、安装配置adb 安装window上&#xff08;其他的自…

excal中遇到数据变成科学计数法的处理方法

1、单元格宽度太小&#xff08;解决办法增加单元格的宽度&#xff09; 2、通过设置单元格格式里面调整 #;#;0;G/通用格式

Python毕业设计 抖音短视频数据分析与可视化 - python 大数据 可视化

文章目录 0 前言1 课题背景2 数据清洗3 数据可视化地区-用户观看时间分界线每周观看观看路径发布地点视频时长整体点赞、完播 4 进阶分析相关性分析留存率 5 深度分析客户价值判断 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕…

Python实现猫狗分类

不废话了&#xff0c;直接上代码&#xff1a; def load_imagepath_from_csv(csv_name):image_path []with open(csv_name,r) as file:csv_reader csv.reader(file)next(csv_reader)for row in csv_reader:image_path.append(row[0])return image_pathimport csv csv_name &…

如何监控制造业精密空调?看这技能就够了!

在半导体制造、电子元件生产、光学设备制造等领域&#xff0c;精密空调监控是关键的保障&#xff0c;因为微小的温度或湿度变化、微生物或颗粒物污染都可能对产品质量和性能造成巨大影响。 精密空调监控系统作为一种高度智能化的解决方案&#xff0c;能够实时监测和调节生产环境…

IIS站点无法启动,万维网发布服务无法开机启动

对于 IIS 站点无法启动和万维网发布服务无法自动启动的问题&#xff0c;你可以尝试以下的注册表设置修改&#xff1a; 1.启动类型设置&#xff1a; 打开注册表编辑器&#xff0c;导航至以下路径&#xff1a;HKEYLOCALMACHINE\SYSTEM\CurrentControlSet\Services\W3SVC 确保在右…

【参赛送好礼】2023 云原生编程挑战赛·赛道 3 赛题解析助您快速 get 参赛技能

大赛介绍 第四届云原生编程挑战赛&#xff0c;是由阿里云主办&#xff0c;云原生应用平台、天池联合承办的云原生著名品牌赛事。 自 2015 年开始&#xff0c;大赛已经成功举办了八届&#xff0c;并从 2020 年开始升级为首届云原生编程挑战赛&#xff0c;共吸引了超过 53000 支…

18、springboot默认的配置文件及导入额外配置文件

springboot默认的配置文件及导入额外配置文件 ★ Spring Boot默认加载的配置文件&#xff1a; (1) 类加载路径&#xff08;resources目录&#xff09;application.properties|yml &#xff08;相当于JAR包内&#xff09;optional: classpath:/ &#xff08;2&#xff09;类加…

中国农村程序员学习此【ES6】购买大平层,开上帕拉梅拉,迎娶白富美出任CEO走上人生巅峰

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录 比较 var 和 let 关键字的作用域--var可能被随时覆盖-全局变量for循环全局作用域函数作用域块作用域循环作用域HTML 中的全局变量提升改变一个用 const 声明的数组防止对象改变使用箭头函数编写简洁的匿名函…

aws的EC2云服务器

亚马逊官网有免费试用1年的服务器 1. 启动生成实例 1.1 创建实例时需要生成 使用的默认的 Debian 和 一个.pem后缀的秘钥 1.2 网上下一个Mobaxterm ,实例名是公有 IPv4 DNS 地址 ,使用SSH连接,登录名是admin 1.3 登录进去后 输入用户名 admin 后进去,sudo su 切换成 root…

python-爬虫作业

# -*- coding:utf-8 -*-Author: 董咚咚 contact: 2648633809qq.com Time: 2023/7/31 17:02 version: 1.0import requests import reimport xlwt from bs4 import BeautifulSoupurl "https://www.dygod.net/html/gndy/dyzz/" hd {user-Agent:Mozilla/4.0 (Windows N…

项目管理困扰?这里有个6W3H解决方案

引言 在项目管理的过程中&#xff0c;我们经常面临各种各样的挑战和问题。例如&#xff0c;如何确定项目的目标&#xff1f;如何分配资源&#xff1f;何时开始执行项目&#xff1f;在哪里进行项目&#xff1f;这些问题如果没有得到正确的解答&#xff0c;将会严重影响项目的进…