一、添加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 }
五、最后效果