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>

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

Spring Boot freemarker导出word下载相关推荐

  1. Spring Boot EasyPoi导出Excel下载

    Java关于excel的操作 Java Excel俗称jxl,可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件,现在基本没有更新了 Apache POI是Apache ...

  2. Spring Boot poi 导出Excel表格、Txt到浏览器下载

    Spring Boot & poi 导出Excel表格.Txt到浏览器下载 原文链接:小回博客 文章目录 Spring Boot & poi 导出Excel表格.Txt到浏览器下载 一 ...

  3. freemarker导出Word文档并在其中插入图片

    先将word转成xml格式,再用notepad将其转为ftl格式(将要填入数据的地方加个占位符,${name}) import java.io.File; import java.io.FileInp ...

  4. Java使用freemarker导出word试卷

    使用了freemarker模板填充占位符的方式来生成word文档,支持跨平台. Java导出Word的五种方式 制作Word模板 将制作好的Word模板.docx另存为.xml格式,修改xml文件的内 ...

  5. 【技能储备】关于自学FreeMarker导出word的那些事

    [新技能Get]关于自学FreeMarker导出word的那些事 最近,项目中需要做一个导出word文件的功能. 这个,简单!原来在公司就用过一个叫什么什么的软件,网上查找了好久,突然发现是要收费的! ...

  6. 使用freemarker导出Word

    使用freemarker导出Word 接上一篇,经常用到导出列表到Word中去,导出Word文档有好多方法,使用POI导出到Word中,也可以使用freemarker制作模板,生成Word文档,使用f ...

  7. FreeMarker导出Word

    FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是一款程 ...

  8. spring使用freemarker生成word文档包含表格、图片(循环插入)

    spring使用freemarker生成word文档包含表格.图片(循环插入) 效果图 因为测试数据是重复的,所以显示都是重复的数据,替换导入map中的数据可以显示不重复的数据. 操作步骤 1,创建一 ...

  9. spring boot结合FastDFSClient做下载文件注意事项

    spring boot结合FastDFSClient做下载文件注意事项 1.后台下载方法走完后,前端页面浏览器一直没出现下载框. 2.ie浏览器兼容问题. 下面的FastDFSClient类依赖fdf ...

最新文章

  1. 解决ubuntu开机进入grub界面的问题
  2. matlab gui七种参数传递方式和范围
  3. 线性求逆元模板_ACM 数论基本模板
  4. vm虚拟机下linux安装python_机器人编程01——虚拟机VM安装Ubuntu并配置python开发环境...
  5. 设计模式--桥(Bridge)模式
  6. Color picker:拾色器
  7. 没有什么是日本牛郎店做不到的......
  8. Linux 学习重点内容(第二节)
  9. java能不能修改文件大小信息_java上机考试3
  10. Java开发中 Double 和 float 不能直接运算
  11. 天猫APP也可以点外卖了!饿了么接入天猫App
  12. 解决mac pro中三指轻按翻译的功能不起作用
  13. 当时明月在,曾照彩云归。
  14. 2019最新Python学习教程_Python学习视频_Python学习路线:学Python,这次你可得认真看完了!
  15. java 龙卷风_龙卷风在大约37000个请求后停止响应
  16. iOS frame与bounds区别详解
  17. 【人情世故】汇报措辞
  18. 基于51单片机的汽车自动照明灯超声波光敏检测远近光灯方案原理图设计
  19. unity开发android游戏(一)搭建Unity安卓开发环境
  20. 近期学员遇到的软件测试面试真题

热门文章

  1. echarts symbol 回调函数_【OpenLayer 实战】实现仿Echarts风格的动态迁徙图/航班图
  2. linux qt手册,明远智睿I.MX6 Linux-4.1.15 QT5 程序编译手册
  3. Win11系统获取管理员权限的方法
  4. myeclipse不是eclipse,servlet 报错 HttpServlet cannot be resolved to a type
  5. Joda-Time几个用法小记
  6. 计算机基础:程序、进程、线程
  7. SpringBoot框架中各层(DTO、DAO、Service、Controller)理解
  8. python画二维数组散点图_2个numpy二维数组的散点图
  9. 金士顿u盘真假软件_简洁轻巧 金士顿DT80 Type-C高速闪存盘评测
  10. java store()_Java.util.Properties.store()