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

一、添加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     }138 }

五、最后效果

(0)

相关推荐