使用FreeMarker导出word文档(支持导出图片)
程序员文章站
2023-03-27 17:00:59
一、添加maven依赖,导入FreeMarker所需要的jar包 二、定义word模板文件 三、修改模板xml文件 把刚刚制作的word文件另存为xml文件 修改这个xml文件,开发工具我用的idea,我是把这个xml文件放在项目中,Ctrl+Alt+L进行格式化,这样文件内容看起来结构比较清晰,方 ......
一、添加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 }
五、最后效果
推荐阅读
-
使用PHP导出Word文档的原理和实例
-
winform 替换word文档中的字段(包含图片添加),生成导出PDF文件(也可是word文件)
-
Java实现用Freemarker完美导出word文档(带图片)
-
使用FreeMarker导出word文档(支持导出图片)
-
Springboot 使用freemaker导出word文档
-
在Word2003文档里如何图片导出
-
关于如何使用freemarker导出word(.doc)
-
Java使用freemarker导出带图片的word文档
-
文档里图片太多手动费事如何将Word里的图片自动批量导出来
-
一个超级好用的绝招可以将WPS Word文档中的图片批量导出