使用FreeMarker导出word文档(支持导出图片)
一、添加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文档(支持导出图片)的更多相关文章
- Java 用Freemarker完美导出word文档(带图片)
Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...
- 【Java】用Freemarker完美导出word文档(带图片)
Java 用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...
- 使用Freemarker导出Word文档(包含图片)代码实现及总结
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- 用 Freemarker 生成 word 文档(包含图片)
1. 用word写一个需要导出的word模板,然后存为xml格式. 2. 将xml中需要动态修改内容的地方,换成freemarker的标识符,例如: <w:p wsp:rsidR="0 ...
- freemarker导出word文档
使用freemarker导出word文档的过程 **************************************************************************** ...
- word文档的导出(用freemarker模板导出)(桃)
1.将要导出的word文档另存为xml格式的 2.用文档编辑器打开(如:notepad++),将要展示的数据用${name}的形式替换,“name”对应数据库中的字段 3.根据模板生成 package ...
- freemarker导出word文档——WordXML格式解析
前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看 ...
- 【Java】导出word文档之freemarker导出
Java导出word文档有很多种方式,本例介绍freemarker导出,根据现有的word模板进行导出 一.简单导出(不含循环导出) 1.新建一个word文件.如下图: 2.使用word将文件另存为x ...
- Java使用freemarker导出word文档
通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...
- NPOI插件生成导出word文档
因为之前没有接触NPOI过这个插件,所以几乎都是自己一边百度摸索一边学习. 这个插件对于Excel的数据导入和导出,可以说是很方便了, 但是对于导出word文档,可以说是很少的,百度了很多....也不 ...
随机推荐
- 洛谷 P1439 【模板】最长公共子序列LCS 解题报告
题目传送门 是一道十分经典的LCS问题 很容易想到 的一般算法:主题代码如下: for (int i = 1; i <= n; i++) for (int j = 1; j <= n; ...
- 响应式Web
响应式布局的核心是:适配不同视口大小的流式布局. RWD和AWD RWD:Responsive Web Design AWD:Adaptive Web Design 实现RWD,多使用流式布局.针对所 ...
- 牛客假日团队赛1B.便便传送门(一)
链接:https://ac.nowcoder.com/acm/contest/918/B 题意: Farmer John最讨厌的农活是运输牛粪.为了精简这个过程,他制造了一个伟大的发明:便便传送门!与 ...
- 牛客练习赛43D(贪心)
有生之年我居然也能不看题解做出来题QAQ-- 发现c.d是0.1序列而不是随机数列说明有蹊跷,于是发现负数直接配0,正数配1即可.不知道哪个最小,那就全求一下吧--我的做法的坑点是数正好为1时不可以选 ...
- 1100 Mars Numbers(20 分)
People on Mars count their numbers with base 13: Zero on Earth is called "tret" on Mars. T ...
- excel单元格内容合并
这几天在整理数据,有时候数据都在表格的不同单元格中,想把两格内容合并为一格,于是验证了两种方法 方法一: (1)在B1输入公式=A1&B1 (2)做完第一步后,选中B1后,鼠标移到单元格右下出 ...
- word2010页脚页码的总页数修改方法
3很多时候做WORD文档时,首页和尾页通常是做为封面与封底的是不做页码统计的. 这时候就需要总页面上减去首页和尾页的数量.以下为修改总页数方法 1.打开WORD文档设置页眉页脚,页脚设置页码, 2.设 ...
- Python+Selenium----处理登录图片验证码
1.说明 在做自动化测试的时候,经常会遇到登录,其中比较麻烦的就是验证码的处理,现在比较常用的图形验证码,每次刷新,得到的验证码不一致,所以,一般来说,获取验证码图片有两种方式: (1)拿到验证码的图 ...
- JS——封闭函数、闭包、内置对象
封闭函数:时javascript中匿名函数的另一种写法,创建一个一开始就执行而不用命名的函数 示例: 1) (function(){ var str = '欢迎访问我的主页'; alert(str); ...
- 10g duplicate and 11g dupliacte db for standby
###################10g Creating a Physical Standby Database OASSTBY Make sure database is in archive ...