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

 <dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.20</version>
</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工具类,并测试

 package com.cccuu.project.utils;

 import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateExceptionHandler;
import org.apache.log4j.Logger;
import sun.misc.BASE64Encoder; import java.io.*;
import java.util.*; /*******************************************
*
* @Package com.cccuu.project.utils
* @Author duan
* @Date 2018/7/27 11:51
* @Version V1.0
*******************************************/
public class FreeMarkerUtil { private static Logger log = Logger.getLogger(FreeMarkerUtil.class);
private static final String ENCODING = "UTF-8";
private static Configuration cfg = new Configuration(); //初始化cfg
static {
//设置模板所在文件夹
cfg.setClassForTemplateLoading(FreeMarkerUtil.class, "/templates/word");
// setEncoding这个方法一定要设置国家及其编码,不然在ftl中的中文在生成html后会变成乱码
cfg.setEncoding(Locale.getDefault(), ENCODING);
// 设置对象的包装器
cfg.setObjectWrapper(new DefaultObjectWrapper());
// 设置异常处理器,这样的话就可以${a.b.c.d}即使没有属性也不会出错
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER); } //获取模板对象
public static Template getTemplate(String templateFileName) throws IOException {
return cfg.getTemplate(templateFileName, ENCODING);
} /**
* 据数据及模板生成文件
* @param data Map的数据结果集
* @param templateFileName ftl模版文件名
* @param outFilePath 生成文件名称(可带路径)
*/
public static File crateFile(Map<String, Object> data, String templateFileName, String outFilePath) {
Writer out = null;
File outFile = new File(outFilePath);
try {
// 获取模板,并设置编码方式,这个编码必须要与页面中的编码格式一致
Template template = getTemplate(templateFileName);
if (!outFile.getParentFile().exists()) {
outFile.getParentFile().mkdirs();
}
out = new OutputStreamWriter(new FileOutputStream(outFile), ENCODING);
// 处理模版
template.process(data, out);
out.flush();
log.info("由模板文件" + templateFileName + "生成" + outFilePath + "成功.");
} catch (Exception e) {
log.error("由模板文件" + templateFileName + "生成" + outFilePath + "出错");
e.printStackTrace();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
log.error("关闭Write对象出错", e);
e.printStackTrace();
}
}
return outFile;
} //获得图片的base64码
public static String getImageBase(String src) throws Exception {
if (src == null || src == "") {
return "";
}
File file = new File(src);
if (!file.exists()) {
return "";
}
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(file);
data = new byte[in.available()];
in.read(data);
in.close();
} catch (IOException e) {
e.printStackTrace();
}
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(data);
} public static void main(String[] args) {
try {
Map<String, Object> data = new HashMap<String, Object>();
data.put("name", "段然涛");
data.put("sex", "男");
data.put("birthday", "1994-03-14");
data.put("phone", "17737138812");
data.put("address", "河南省许昌市");
data.put("school", "江西科技师范大学");
List<Map<String, String>> educations = new ArrayList<Map<String, String>>();
Map<String, String> paramsMap = new HashMap<String, String>();
paramsMap.put("school", "禹州一高");
paramsMap.put("startDate", "2008-09");
paramsMap.put("endDate", "2012-06");
paramsMap.put("person", "李磊");
Map<String, String> paramsMap2 = new HashMap<String, String>();
paramsMap2.put("school", "江西科技师范大学");
paramsMap2.put("startDate", "2012-09");
paramsMap2.put("endDate", "2016-07");
paramsMap2.put("person", "李杰");
educations.add(paramsMap);
educations.add(paramsMap2);
data.put("educations", educations);
List<String> images = new ArrayList<String>();
images.add(getImageBase("C:/Users/Administrator/Desktop/图片/timg.jpg"));
images.add(getImageBase("C:/Users/Administrator/Desktop/图片/timg11.jpg"));
data.put("images", images);
crateFile(data, "文档1.ftl", "C:/Users/Administrator/Desktop/文档/简历.doc");
} catch (Exception e) {
e.printStackTrace();
}
}
}

五、最后效果

使用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. jmeter小问题解决方案合集

    问题1.在http请求,post的body中输入中文,显示乱码,怎么解决? 在jmeter的bin目录下,找到这个文件jmeter.properties,把jsyntaxtextarea.font.f ...

  2. jquery对象里面的context参数

    jquery源码: jQuery = function( selector, context ) { // The jQuery object is actually just the init co ...

  3. P1089津津的储蓄计划

    题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在 ...

  4. Java文件与io——字节数组流数据流字符串流

    字节数组流 ByteArrayInputStream:包含一个内部缓冲区,该缓冲区包含从流中读取的字节.内部计数器跟踪read方法要提供的下一个字节.关闭ByteArrayInputStream无效. ...

  5. asp.net mvc里面竟然也可以用eval()

    刚才在项目里面看到了一个牛逼的用法: style="display:<%# Eval("IsSharingPlatformDisplay") %>" ...

  6. cgkib动态代理详解-不依赖接口,速度快

    1. cglib原理-不依赖接口,速度快 使用ASM字节框架动态生成要代理类的子类,子类重写final以外的方法,织入横切逻辑 2. 示例-实现MethodInterceptor Test.java ...

  7. codesmith 在安装32位Oracle 客户端问题解决

    问题解决办法如下: https://blog.csdn.net/csdn1152789046/article/details/52248669

  8. 使用Pycharm开发python下django框架项目生成的文件解释

    目录MyDjangoProject下表示工程的全局配置,分别为setttings.py.urls.py和wsgi.py,1.其中setttings.py包括了系统的数据库配置.应用配置和其他配置,2. ...

  9. 利用XML序列化和Asp.Net Web缓存实现站点配置文件

    我们经常会遇到这样的场景: 今天来了个业务,需要加一个字段,但是考虑的以后可能有变动,需要配成“活”的. 一般最初的做法就是加一个配置到Web.Config文件的AppSettings中去.但是这样有 ...

  10. It's the loneliest feeling not to know who you are.

    It's the loneliest feeling not to know who you are.最孤独的感觉莫过于不知道自己是谁.