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

效果图展示:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5 半透明覆层材质

文章目录 前言介绍示例1示例2示例3 前言 本文采用虚幻5.2.1版本演示&#xff0c;介绍半透明覆层材质&#xff08;覆层材质&#xff09;。 介绍 半透明覆层材质是 UE5.1 版本 更新的功能&#xff0c;使用半透明覆层材质&#xff0c;可以轻松的给物体表面附着一层材质。 在UE5…

Python3 处理PDF之PyMuPDF 入门

PyMuPDF 简介 PyMuPDF是一个用于处理PDF文件的Python库&#xff0c;它提供了丰富的功能来操作、分析和转换PDF文档。这个库的设计目标是提供一个简单易用的API,使得开发者能够轻松地在Python程序中实现PDF文件的各种操作。 PyMuPDF的主要特点如下&#xff1a; 跨平台兼容性&a…

Aspose.Imaging for Python via .NET Crack

Aspose.Imaging for Python via .NET Crack Aspose.Imaging for Python via.NET是一个提供高级图像处理功能的库。您可以使用此API轻松创建、加载、操作、转换或压缩图像。另外&#xff0c;Aspose.Imaging for Python通过.NET支持绘图和使用图形基元。图像导出和转换-API的核心…

SpringCloud(29):Nacos简介

1 什么是配置中心 1.1 什么是配置 应用程序在启动和运行的时候往往需要读取一些配置信息&#xff0c;配置基本上伴随着应用程序的整个生命周期&#xff0c;比如&#xff1a;数据库连接参数、启动参数等。 配置主要有以下几个特点&#xff1a; 配置是独立于程序的只读变量 …

编译LightGBM错误处理记录

在LightGBM源码中新建文件夹build&#xff0c;然后在build目录下运行命令 cmake -A x64 -DUSE_GPU1 -DBOOST_ROOTC:\local\boost_1_82_0 -DBOOST_LIBRARYDIRC:\local\boost_1_82_0\lib64-msvc-14.3 .. 报错 错误原因&#xff1a; miniconda3\Library\lib\cmake\中boost版本是…

状态模式(State)

状态模式是一种行为设计模式&#xff0c;允许一个对象在其内部状态改变时改变它的行为&#xff0c;使其看起来修改了自身所属的类。其别名为状态对象(Objects for States)。 State is a behavior design pattern that allows an object to change its behavior when its inter…

前端个人年度工作述职报告(二十篇)

前端个人年度工作述职报告篇1 尊敬的各位领导、各位同仁&#xff1a; 大家好!按照20__年度我公司就职人员工作评估的安排和要求&#xff0c;我认真剖析、总结了自己的工作情况&#xff0c;现将本人工作开展情况向各位领导、同仁做以汇报&#xff0c;有不妥之处&#xff0c;希…

【前瞻】视频技术的发展趋势讨论以及应用场景

视频技术的发展可以追溯到19世纪初期的早期实验。到20世纪初期&#xff0c;电视技术的发明和普及促进了视频技术的进一步发展。 1&#xff09;数字化&#xff1a;数字化技术的发明和发展使得视频技术更加先进。数字电视信号具有更高的清晰度和更大的带宽&#xff0c;可以更快地…

ospf减少LSA更新

实验及实验要求 一、思路 1.根据区域划分IP地址 2.使公网可通---写缺省 3.使R3成为MGRE中心站点&#xff0c;R5、R6、R7为分支站点 4.一个个去配置ospf区域和RIP区域&#xff0c;确保每个区域配置无误 5.区域0要更改OSPF在接口的工作类型为broadcast &#xff0c;并使R3为…

【C++】容器篇(五)—— map和set的基本介绍

序言&#xff1a; 在之前&#xff0c;我们已经对STL中的 序列式容器 进行了相关的学习。本期&#xff0c;我将给大家介绍的则是另外一类容器 —— 关联式容器 &#xff01;&#xff01;&#xff01; 目录 &#xff08;一&#xff09;容器回顾 &#x1f4a8;【顺序容器】 &a…

【二进制安全】堆漏洞:Double Free原理

参考&#xff1a;https://www.anquanke.com/post/id/241598 次要参考&#xff1a;https://xz.aliyun.com/t/6342 malloc_chunk 的源码如下&#xff1a; struct malloc_chunk { INTERNAL_SIZE_T prev_size; /*前一个chunk的大小*/ INTERNAL_SIZE_T size; /*当前chunk的…

无涯教程-Perl - binmode函数

描述 此函数设置在区分两者的操作系统上以二进制形式读取和写入FILEHANDLE的格式。非二进制文件的CR LF序列在输入时转换为LF,在LF时在输出时转换为CR LF。这对于使用两个字符分隔文本文件中的行的操作系统(MS-DOS)至关重要,但对使用单个字符的操作系统(Unix,Mac OS,QNX)没有影…

C#中XML文档与Treeview控件操作的数据同步

在前文《C#使用XML和Treeview结合实现复杂数据采集功能》中&#xff0c;使用Treeview展示了XML的数据&#xff0c;问题是如果在Treeview上进行了操作&#xff0c;怎样同步更改XML数据的内容呢&#xff1f; 这个问题看似简单&#xff0c;实现起来有一点小麻烦。 要实现的操作功能…

6.s081/6.1810(Fall 2022)Lab2: System calls

文章目录 前言其他篇章参考链接0. 前置准备1. System call tracing (moderate)1.1 简单分析1.2 Hint 11.3 Hint 21.4 Hint 31.5 Hint 41.6 Hint 51.7 测试 2. Sysinfo (moderate)2.1 声明2.2 实现2.2.1 框架2.2.2 用户态与内核态交互2.2.3 计算空闲内存的大小2.2.4 计算非UNUSE…

postgresql表膨胀处理之pgcompacttable部署及使用

环境&#xff1a; 1&#xff09;redhat-release&#xff1a;CentOS Linux release 7.6.1810 (Core) 2&#xff09;database version&#xff1a;postgresql 14.6 一、添加pgstattuple pgcompacttable工具使用过程中需要依赖pgstattuple&#xff0c;因此需先添加pgstattuple…

工业控制系统安全控制应用指南

工业控制系统安全控制应用 指南 工业控制系统&#xff08;ICS&#xff09;&#xff08;包括监控和数据采集系统&#xff08;SCADA&#xff09;、分布式控制系统(DCS)、可编程逻辑控制器(PLC)等产品&#xff09;在核设施、航空航天、先进制造、石油石化、油气管网、电力系统、交…

Qt应用开发(基础篇)——时间类 QDateTime、QDate、QTime

一、前言 时间类QDateTime、QDate、QTime、QTimeZone保存了Qt的时间、日期、时区信息&#xff0c;常用的时间类部件都会用到这些数据结构&#xff0c;常用概念有年、月、日、时、分、秒、毫秒和时区&#xff0c;时间和时区就关系到时间戳和UTC的概念。 UTC时间&#xff0c;又称…

K8s中的核心技术Helm

1.helm的引入 &#xff08;1&#xff09;编写yaml文件 &#xff08;2&#xff09;编写deployment文件 &#xff08;3&#xff09;编写service文件 &#xff08;4&#xff09;编写Ingress文件 2.helm的引入解决的问题&#xff1f; &#xff08;1&#xff09;使用helm可以把…

oracle 存储过程返回 结果集 table形式 (使用sys_refcursor 及程序包package 两种方式)

1.创建一个表Test用来测试. 1 CREATE TABLE "TEST" 2 ( "AAA" NUMBER(*,0), 3 "BBB" VARCHAR2(10 BYTE) 4 ) 2.向Test表中插入测试数据 1 insert into Test values(1,a); 2 insert into Test values(2,b); 3 insert into Test …

Arthas协助MQ消费性能优化

背景 项目中使用AWS的SQS消息队列进行异步处理&#xff0c;QA通过压测发现单机TPS在23左右&#xff0c;目标性能在500TPS&#xff0c;所以需要对消费逻辑进行优化&#xff0c;提升消费速度。 目标 消费TPS从23提升到500 优化流程 优化的思路是先分析定位性能瓶颈&#xff…