一、添加maven依赖,导入FreeMarker所需要的jar包

  1. <dependency>
  2. <groupId>org.freemarker</groupId>
  3. <artifactId>freemarker</artifactId>
  4. <version>2.3.20</version>
  5. </dependency>

二、定义word模板文件

三、修改模板xml文件

把刚刚制作的word文件另存为xml文件

修改这个xml文件,开发工具我用的idea,我是把这个xml文件放在项目中,Ctrl+Alt+L进行格式化,这样文件内容看起来结构比较清晰,方便修改,你也可以使用其他xml编辑器等等

把文档内容中的动态数据,换成freemarker的标识。其实就是Map<String, Object>中key,如把段然涛换成${name};

教育经历是需要循环遍历的,在这里可以循环遍历list,list中存储的都是Map数据,然后再一一取出

折叠起来看就是这样,一定不要忘记了结束的list标签

接下来就是图片了,在加入了图片占位的地方,会看到一片base64编码后的代码,把base64删除替换成${image},图片不确定有多少张,也是需要循环遍历的

这些全部弄好之后,模板就制作完了,修改文件为.ftl即可,然后把模板放入到项目中

四、代码编写

接下来就是代码部分了,编写FreeMarkerUtil工具类,并测试

  1. package com.cccuu.project.utils;
  2.  
  3. import freemarker.template.Configuration;
  4. import freemarker.template.DefaultObjectWrapper;
  5. import freemarker.template.Template;
  6. import freemarker.template.TemplateExceptionHandler;
  7. import org.apache.log4j.Logger;
  8. import sun.misc.BASE64Encoder;
  9.  
  10. import java.io.*;
  11. import java.util.*;
  12.  
  13. /*******************************************
  14. *
  15. * @Package com.cccuu.project.utils
  16. * @Author duan
  17. * @Date 2018/7/27 11:51
  18. * @Version V1.0
  19. *******************************************/
  20. public class FreeMarkerUtil {
  21.  
  22. private static Logger log = Logger.getLogger(FreeMarkerUtil.class);
  23. private static final String ENCODING = "UTF-8";
  24. private static Configuration cfg = new Configuration();
  25.  
  26. //初始化cfg
  27. static {
  28. //设置模板所在文件夹
  29. cfg.setClassForTemplateLoading(FreeMarkerUtil.class, "/templates/word");
  30. // setEncoding这个方法一定要设置国家及其编码,不然在ftl中的中文在生成html后会变成乱码
  31. cfg.setEncoding(Locale.getDefault(), ENCODING);
  32. // 设置对象的包装器
  33. cfg.setObjectWrapper(new DefaultObjectWrapper());
  34. // 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错
  35. cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);
  36.  
  37. }
  38.  
  39. //获取模板对象
  40. public static Template getTemplate(String templateFileName) throws IOException {
  41. return cfg.getTemplate(templateFileName, ENCODING);
  42. }
  43.  
  44. /**
  45. * 据数据及模板生成文件
  46. * @param data Map的数据结果集
  47. * @param templateFileName ftl模版文件名
  48. * @param outFilePath 生成文件名称(可带路径)
  49. */
  50. public static File crateFile(Map<String, Object> data, String templateFileName, String outFilePath) {
  51. Writer out = null;
  52. File outFile = new File(outFilePath);
  53. try {
  54. // 获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
  55. Template template = getTemplate(templateFileName);
  56. if (!outFile.getParentFile().exists()) {
  57. outFile.getParentFile().mkdirs();
  58. }
  59. out = new OutputStreamWriter(new FileOutputStream(outFile), ENCODING);
  60. // 处理模版
  61. template.process(data, out);
  62. out.flush();
  63. log.info("由模板文件" + templateFileName + "生成" + outFilePath + "成功.");
  64. } catch (Exception e) {
  65. log.error("由模板文件" + templateFileName + "生成" + outFilePath + "出错");
  66. e.printStackTrace();
  67. } finally {
  68. try {
  69. if (out != null) {
  70. out.close();
  71. }
  72. } catch (IOException e) {
  73. log.error("关闭Write对象出错", e);
  74. e.printStackTrace();
  75. }
  76. }
  77. return outFile;
  78. }
  79.  
  80. //获得图片的base64码
  81. public static String getImageBase(String src) throws Exception {
  82. if (src == null || src == "") {
  83. return "";
  84. }
  85. File file = new File(src);
  86. if (!file.exists()) {
  87. return "";
  88. }
  89. InputStream in = null;
  90. byte[] data = null;
  91. try {
  92. in = new FileInputStream(file);
  93. data = new byte[in.available()];
  94. in.read(data);
  95. in.close();
  96. } catch (IOException e) {
  97. e.printStackTrace();
  98. }
  99. BASE64Encoder encoder = new BASE64Encoder();
  100. return encoder.encode(data);
  101. }
  102.  
  103. public static void main(String[] args) {
  104. try {
  105. Map<String, Object> data = new HashMap<String, Object>();
  106. data.put("name", "段然涛");
  107. data.put("sex", "男");
  108. data.put("birthday", "1994-03-14");
  109. data.put("phone", "17737138812");
  110. data.put("address", "河南省许昌市");
  111. data.put("school", "江西科技师范大学");
  112. List<Map<String, String>> educations = new ArrayList<Map<String, String>>();
  113. Map<String, String> paramsMap = new HashMap<String, String>();
  114. paramsMap.put("school", "禹州一高");
  115. paramsMap.put("startDate", "2008-09");
  116. paramsMap.put("endDate", "2012-06");
  117. paramsMap.put("person", "李磊");
  118. Map<String, String> paramsMap2 = new HashMap<String, String>();
  119. paramsMap2.put("school", "江西科技师范大学");
  120. paramsMap2.put("startDate", "2012-09");
  121. paramsMap2.put("endDate", "2016-07");
  122. paramsMap2.put("person", "李杰");
  123. educations.add(paramsMap);
  124. educations.add(paramsMap2);
  125. data.put("educations", educations);
  126. List<String> images = new ArrayList<String>();
  127. images.add(getImageBase("C:/Users/Administrator/Desktop/图片/timg.jpg"));
  128. images.add(getImageBase("C:/Users/Administrator/Desktop/图片/timg11.jpg"));
  129. data.put("images", images);
  130. crateFile(data, "文档1.ftl", "C:/Users/Administrator/Desktop/文档/简历.doc");
  131. } catch (Exception e) {
  132. e.printStackTrace();
  133. }
  134. }
  135. }

五、最后效果

使用FreeMarker导出word文档(支持导出图片)的更多相关文章

  1. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  2. 【Java】用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  3. 使用Freemarker导出Word文档(包含图片)代码实现及总结

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  4. 用 Freemarker 生成 word 文档(包含图片)

    1. 用word写一个需要导出的word模板,然后存为xml格式. 2. 将xml中需要动态修改内容的地方,换成freemarker的标识符,例如: <w:p wsp:rsidR="0 ...

  5. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  6. word文档的导出(用freemarker模板导出)(桃)

    1.将要导出的word文档另存为xml格式的 2.用文档编辑器打开(如:notepad++),将要展示的数据用${name}的形式替换,“name”对应数据库中的字段 3.根据模板生成 package ...

  7. freemarker导出word文档——WordXML格式解析

    前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...

  8. 【Java】导出word文档之freemarker导出

    Java导出word文档有很多种方式,本例介绍freemarker导出,根据现有的word模板进行导出 一.简单导出(不含循环导出) 1.新建一个word文件.如下图: 2.使用word将文件另存为x ...

  9. Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  10. NPOI插件生成导出word文档

    因为之前没有接触NPOI过这个插件,所以几乎都是自己一边百度摸索一边学习. 这个插件对于Excel的数据导入和导出,可以说是很方便了, 但是对于导出word文档,可以说是很少的,百度了很多....也不 ...

随机推荐

  1. Qt学习之网络编程(二)

    UDP协议 UDP协议(用户数据报协议)是一种简单轻量级.不可靠.面向数据报.无连接的传输层协议.之后我们会介绍TCP协议,相对于UDP,TCP是一种可靠的.有连接的协议:既然这样我们就用TCP不就好 ...

  2. sysbench压力测试总结

    sysbench压力测试工具简介sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL.Orac ...

  3. vue——踩坑

    打包的时候,要记得改一下这个配置路径~ 教程:https://www.cnblogs.com/wanf/p/7871787.html

  4. CUDA杂谈

    这一年都在编写CUDA的程序,用了很多优化的手段,发现大部分其实还是官方的指南里面的手段 https://docs.nvidia.com/cuda/cuda-c-best-practices-guid ...

  5. OpenStack创建实例错误解决方法

    实例执行所请求操作失败,实例处于错误状态.: 请稍后再试 [错误: Build of instance beaeb5e0-26eb-4044-ae14-bb87d509886d aborted: Fa ...

  6. 关于vi 分屏的一些指令

    分屏都是以ctrl + W(大写) 首先,ctrl+ W  , v    为切屏 之后用 :e 打开其他文件 ctrl + W , c 为关闭当前分屏 ctrl + W , h 为切换到左侧分屏   ...

  7. 关于response.write(alert(''))弹窗改变页面格式问题

    不建议使用 Response.Write("<script>alert('增加年级失败')</script>"); 而使用 Page.ClientScrip ...

  8. linux下安装redis和部署

    转自简书:https://www.jianshu.com/p/bc84b2b71c1c 1.基础知识  redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值 ...

  9. angular 学习笔记(3) ng-repeat遍历json并且给样式

    视图: <div ng-app="myapp" ng-controller="myctrl"> <ul> <li ng-repea ...

  10. 关于node中的板块问题

    最近自己在看node实战那本书,不过发现有一些书上不对的地方,罗列如下:1.connect服务自己有一些中间件可供使用,但是书上说的有cookie-parser.logger.favicon和body ...