Spring Boot freemarker导出word下载

freemarker详解

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据。

项目图片

在这里插入图片描述

操作流程

准备doc模版
在这里插入图片描述

另存为xml文件

在这里插入图片描述
修改名为userList.ftl后拷贝文件到src/main/resources

在这里插入图片描述

如何修改userList.ftl

Eclipse下如何打开ftl文件

下载一个专门的ftl编辑器插件,然后在里面格式化;
或者设置ftl的编辑器为jsp的编辑器,用它做format,eclipse->windows->preferences
在这里插入图片描述

修改userList.ftl第一步

原来,注意rId4的位置

<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"Target="word/document.xml" />

现在

<#list list as user> <Relationship Id="rId${user_index}Png"Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument"Target="word/document.xml" /> 
</#list>

修改userList.ftl第二步

原来,注意rId4的位置,image1.png

<Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"Target="media/image1.png" />

现在

<#list list as user> <Relationship Id="rId${user_index}Png"Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image${user_index}.png" />
</#list>

修改userList.ftl第三步

原来

<w:tr><w:tblPrEx><w:tblBorders><w:top w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:left w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:bottom w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:right w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:insideH w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:insideV w:val="single" w:color="auto" w:sz="4" w:space="0" /></w:tblBorders><w:tblLayout w:type="fixed" /><w:tblCellMar><w:left w:w="108" w:type="dxa" /><w:right w:w="108" w:type="dxa" /></w:tblCellMar></w:tblPrEx><w:tc><w:tcPr><w:tcW w:w="2130" w:type="dxa" /><w:vAlign w:val="top" /></w:tcPr><w:p><w:pPr><w:pStyle w:val="4" /><w:jc w:val="center" /><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr><w:t>111</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2130" w:type="dxa" /><w:vAlign w:val="top" /></w:tcPr><w:p><w:pPr><w:pStyle w:val="4" /><w:jc w:val="center" /><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr><w:t>222</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2131" w:type="dxa" /><w:vAlign w:val="top" /></w:tcPr><w:p><w:pPr><w:pStyle w:val="4" /><w:jc w:val="center" /><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr><w:t>333</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2131" w:type="dxa" /><w:vAlign w:val="top" /></w:tcPr><w:p><w:pPr><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr><w:pict><v:shape id="_x0000_i1026" o:spt="75" alt="wx" type="#_x0000_t75" style="height:93.25pt;width:95.6pt;"filled="f" o:preferrelative="t" stroked="f" coordsize="21600,21600"><v:path /><v:fill on="f" focussize="0,0" /><v:stroke on="f" /><v:imagedata r:id="rId4" o:title="wx" /><o:lock v:ext="edit" aspectratio="t" /><w10:wrap type="none" /><w10:anchorlock /></v:shape></w:pict></w:r></w:p></w:tc></w:tr>

现在

<#list list as user><w:tr><w:tblPrEx><w:tblBorders><w:top w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:left w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:bottom w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:right w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:insideH w:val="single" w:color="auto" w:sz="4" w:space="0" /><w:insideV w:val="single" w:color="auto" w:sz="4" w:space="0" /></w:tblBorders><w:tblLayout w:type="fixed" /><w:tblCellMar><w:left w:w="108" w:type="dxa" /><w:right w:w="108" w:type="dxa" /></w:tblCellMar></w:tblPrEx><w:tc><w:tcPr><w:tcW w:w="2130" w:type="dxa" /><w:vAlign w:val="top" /></w:tcPr><w:p><w:pPr><w:pStyle w:val="4" /><w:jc w:val="center" /><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr><w:t>${user.id}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2130" w:type="dxa" /><w:vAlign w:val="top" /></w:tcPr><w:p><w:pPr><w:pStyle w:val="4" /><w:jc w:val="center" /><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr><w:t>${user.name}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2131" w:type="dxa" /><w:vAlign w:val="top" /></w:tcPr><w:p><w:pPr><w:pStyle w:val="4" /><w:jc w:val="center" /><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr><w:t>${user.age}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2131" w:type="dxa" /><w:vAlign w:val="top" /></w:tcPr><w:p><w:pPr><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:hint="eastAsia" /><w:lang w:val="en-US" w:eastAsia="zh-CN" /></w:rPr><w:pict><v:shape id="_x0000_i1026" o:spt="75" alt="${user.name}" type="#_x0000_t75"style="height:93.25pt;width:95.6pt;" filled="f" o:preferrelative="t" stroked="f"coordsize="21600,21600"><v:path /><v:fill on="f" focussize="0,0" /><v:stroke on="f" /><v:imagedata r:id="rId${user_index}Png" o:title="${user.name}" /><o:lock v:ext="edit" aspectratio="t" /><w10:wrap type="none" /><w10:anchorlock /></v:shape></w:pict></w:r></w:p></w:tc></w:tr></#list>

修改userList.ftl第四步,关键是图片

原来

<pkg:part pkg:name="/word/media/image1.png" pkg:contentType="image/png"><pkg:binaryData>iVBORw0KGgoAAAANSUhEUgAAAPEAAADrCAYAAAC4hnD0AAAgAElEQVR4nOx9B5wkZZn.....
gxxYtZVEXKLEIEZJxCVKDHJAxP8PvwV4N/MWQn4AAAAASUVORK5CYII=</pkg:binaryData></pkg:part>

现在

<#list list as user><pkg:part pkg:name="/word/media/image${user_index}.png" pkg:contentType="image/png"><pkg:binaryData>${user.headPortrait}</pkg:binaryData></pkg:part></#list>

注意标签闭合,image名称对应

UserController.download方法

@Autowiredprivate FreeMarkerConfigurer freeMarkerConfigurer;private Base64 b64Encoder = new Base64();// 处理下载word文档@RequestMapping("/download")public void download(HttpServletRequest request, HttpServletResponse response) throws Exception {// 告诉浏览器用什么软件可以打开此文件response.setHeader("content-Type", "application/msword");// 下载文件的默认名称response.setHeader("Content-Disposition", "attachment;filename=xx.doc");freeMarkerConfigurer.getConfiguration().setClassForTemplateLoading(getClass(), "/");Template template = freeMarkerConfigurer.getConfiguration().getTemplate("userList.ftl");String webapp = request.getServletContext().getRealPath("/");List<User> list = userRepository.findAll();for (int i = 0; i < list.size(); i++) {User user = list.get(i);File file = new File(webapp, user.getHeadPortrait());FileInputStream fis = new FileInputStream(file);byte[] imgData = new byte[fis.available()];fis.read(imgData);fis.close();String headPortrait = b64Encoder.encodeAsString(imgData);user.setHeadPortrait(headPortrait);}Map<String, Object> root = new HashMap<String, Object>();root.put("list", list);template.process(root, new OutputStreamWriter(response.getOutputStream()));}

user.jsp,添加的核心代码

function headPortraitFormatter(value,row,index){if (value){return "[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tlmwspiM-1581738030149)("+value+")]";} else {return "";}
}<th data-options="field:'headPortrait',width:10,formatter:headPortraitFormatter">头像</th><a data-url="downloadUser" href="javascript:void(0)" class="easyui-linkbutton c5" iconCls="icon-reload">word下载</a>

如果感觉不错记得点赞哟!!!

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

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

相关文章

学生用计算机怎么累加,计算机一级OFFICE辅导:累加小技巧

我们在工作中常常需要在已有数值的单元格中再增加或减去另一个数。一般是在计算器中计算后再覆盖原有的数据。这样操作起来很不方便。考试大编辑推荐一个小技巧&#xff0c;可以有效地简化老式的工作过程。(1).创建一个宏&#xff1a;选择Excel选单下的“工具→宏→录制新宏”选…

不同进制之间的转化

将二进制、八进制、十六进制转换为十进制 二进制、八进制和十六进制向十进制转换都非常容易&#xff0c;就是“按权相加”。所谓“权”&#xff0c;也即“位权”。 假设当前数字是 N 进制&#xff0c;那么&#xff1a; 对于整数部分&#xff0c;从右往左看&#xff0c;第 i 位…

[刨根问底] 五分钟搞懂组合评价模型—模糊Borda (以2021 年大学生数模国赛C题为例)

组合评价模型—模糊Borda(Matlab) 我们的征途是星辰大海&#xff0c;而并非烟尘人间。 目录 组合评价模型—模糊Borda(Matlab) 一、模糊Borda法简介 二、模糊Borda法主要步骤 &#xff08;1&#xff09;计算隶属度 &#xff08;2&#xff09;计算模糊频数 &#xff08;…

计算机桌面右键新建展不开,Win10右键新建不见了怎么办?Win10电脑桌面右键新建没有了解决方法...

近期有Win10用户遇到一个问题&#xff0c;也就是电脑桌面右键新建没有了&#xff0c;比如想要创建一个文本文档、文件夹、Word&#xff0c;没有新建功能无法创建&#xff0c;那么Win10右键新建不见了怎么办&#xff1f;下面装机之家分享一下Win10电脑桌面右键新建没有了解决方法…

最常用的客观赋权方法——熵权法

我们的征途是星辰大海&#xff0c;而并非烟尘人间。 文章目录 一、熵权法的原理 1.1 信息熵 1.2 熵权法 二、熵权法的主要步骤 2.1 数据标准化 2.2 求各指标在各方案下的比值 2.3 求各指标的信息熵。 2.4 确定各指标的权重 2.4.1 通过信息熵计算各指标的权重&#…

2017韩老师计算机网络,2017年计算机等考三级网络技术辅导:计算机网络拓扑结构...

1&#xff0e;计算机网络拓扑的定义计算机网络设计的第一步就是网络拓扑设计。拓扑学是几何学的一个分支。计算机网络拓扑是通过网中结点与通信线路之间的几何关系表示网络结构&#xff0c;反映出网络各实体之间的结构关系。2&#xff0e;网络拓扑的分类网络拓扑可以根据通信子…

Spring Boot html页面解析之jsoup

目的 我们要对一个页面进行数据抓取&#xff0c;并导出doc文档 html解析器 jsoup 直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API&#xff0c;可通过DOM&#xff0c;CSS以及类似于JQuery的操作方法来取出和操作数据。 htmlparser 提供了线性和嵌套两种方…

2021年五一杯数学建模A题(疫苗生产调度问题)详细分析

目录 一、基本介绍 1.1 题目描述 1.2 待解决问题 二、问题分析与求解 2.1 问题一分析与求解 2.2 问题二分析与求解 2.3 问题三分析与求解 2.4 问题四分析与求解 2.5 问题五分析与求解 三、完整代码 四、总结 一、基本介绍 1.1 题目描述 新冠肺炎肆虐全球&#xff0…

Spring Boot EasyPoi导出Excel下载

Java关于excel的操作 Java Excel俗称jxl&#xff0c;可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件&#xff0c;现在基本没有更新了 Apache POI是Apache基金组织Jakarta项目的子项目&#xff0c;它包括一系列的API&#xff0c;可以操作多种格式的Mic…

2021年华中杯A题(马赛克瓷砖选色问题)详细分析

目录 一、基本介绍 1.1 题目描述 1.2 待解决问题 二、问题分析与求解 2.1 问题一分析与求解 2.2 问题二分析与求解 2.3 问题三分析与求解 三、完整代码 四、总结 一、基本介绍 1.1 题目描述 马赛克瓷砖是一种尺寸较小&#xff08;常见规格为边长不超过 5cm&#xff09…

计算机无法连接无线信号,win7系统连接无线信号时提示Windows无法连接到路由器名称的四种解决方法...

现如今网络发展速度非常快&#xff0c;无线网络已经普及了&#xff0c;使用率高了遇到的问题也就多了。比如有时候笔记本win7系统连接无线信号时出现“Windows无法连接到路由器名称”(如下图所示)&#xff0c;该如何解决此问题呢&#xff1f;下面脚本之家的小编介绍几种解决方法…

数据采集与清洗基础习题(四)Pandas初体验,头歌参考答案

数据采集习题参考答案&#xff0c;会持续更新&#xff0c;点个关注防丢失。 创作不易&#xff0c;一键三连给博主一个支持呗。 为了方便查找&#xff0c;已按照头歌重新排版&#xff0c;朋友们按照头歌所属门类查找实训哦&#xff0c;该篇为Pandas。 文章目录 实训一&#…

全国计算机准考证打印2015年,甘肃2015下半年全国计算机等级考试准考证打印时间...

甘肃2015下半年全国计算机等级考试准考证打印时间一、打印准考证考生可在考前2周之内登陆全省统一报名网站自主打印准考证&#xff0c;或到考点现场领取准考证。二、考试时间下半年&#xff1a;2015年9月19日至21日&#xff0c;分批进行。考试具体时间、地点均以“准考证”为准…

TOPSIS与模糊Borda 的组合应用(以第二届大湾区杯和国赛为案例)

目录 一、TOPSIS&#xff08;优劣解距离法&#xff09;简介 二、TOPSIS&#xff08;优劣解距离法&#xff09;主要步骤 &#xff08;1&#xff09;数据进行标准化 &#xff08;2&#xff09;构建决策矩阵 &#xff08;3&#xff09;构造加权规范阵 &#xff08;4&#xf…

Spring Boot 页面国际化

internationalization详解 国际化&#xff08;internationalization&#xff09;是设计和制造容易适应不同区域要求的产品的一种方式。它要求从产品中抽离所有地域语言&#xff0c;国家/地区和文化相关的元素。换言之&#xff0c;应用程序的功能和代码设计考虑在不同地区运行的…

唯美计算机语言,唯美精辟的语句

1、当泪水一滴滴的掉落在我的手上&#xff0c;那时竟想为何我非你不可&#xff01;2、原来再美好的承诺&#xff0c;最终还是会被现实打败。3、明明不是陌生人&#xff0c;却装的&#xff0c;比陌生人&#xff0c;还要陌生。4、如果我是个瘦子&#xff0c;伤心时我还可以数数排…

不到30的成本,还不赶紧造起来——盘点软著申请小知识

今年上半年的时候跟着老师做项目&#xff0c;为了学习应付中期报告&#xff0c;就自己写了一个小软件&#xff0c;然后申请了一个软著&#xff0c;至于为啥要头铁的自己上呢&#xff0c;因为想要拿独立著作权&#xff0c;那当然是没有报销的啦~&#xff0c;这里有同学就要问啦&…

Linux系统安装及配置——Centos-7-X86_64-DVD-2009

目录 1.下载 VMware Workstation软件 2.下载 Centos-7-X86_64-DVD-2009.iso 3.安装并配置 3.1打开VMware Workstation&#xff0c;选择创建新的虚拟机 3.2选择自定义&#xff0c;然后下一步 3.3下一步 3.4选择稍后安装操作系统&#xff0c;然后下一步 3.5选择Linux&am…

2018年12月份计算机,CPU天梯图2018年12月最新版 十二月台式电脑CPU性能排行

Helio&#xff0c;大家好&#xff0c;11月再见12月你好&#xff01;欢迎关注IT数码通带来的最新一期桌面CPU天梯图。距离上一次天梯图更新已经过去一个月时间了&#xff0c;伴随着12月份到来&#xff0c;新的天梯图需要进行更新和完善了。接下来“IT数码通”小编为大家带来了CP…

C语言程序的错误和警告

一段C语言代码&#xff0c;在编译、链接和运行的各个阶段都可能会出现问题。编译器只能检查编译和链接阶段出现的问题&#xff0c;而可执行程序已经脱离了编译器&#xff0c;运行阶段出现问题编译器是无能为力的。 如果我们编写的代码正确&#xff0c;运行时会提示没有错误&am…