1.编辑好word

2.将word模板另存为xml格式, 把需要动态生成的文字用${xxx}代替

eg: 张强 替换为:${name}

注意:图片是很长的一个base64的字符,同样替换就好 比如替换为 ${photo}

3.将xml模板文件后缀名改为.ftl (这点其实可以不要,我看网上好多命名为 .ftl  还有 .tpl, 开始也纠结看了很久,经实践,后缀名,改不改都无所谓,改成 .ttt也行,猜测只是为了著名使用freeMark 解析的所以才命名为 .ftl, 另外猜测文件头已经说明是下,xml了,所以你改成任何后缀名都可以,反正都是xml文件)

4.如果有循环输出 搜索关键字,补入 <#list userList  as user> </#list>或其它freemarker标签

相关代码片段

需要生成的数据:

 //获得图片的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);
}
 /**
* 生成doc文件
* @param filePath 临时文件路径
* @param templateName 模板名字
* @param dataMap 数据集合
* @return
*/
public static File createDoc(String filePath, String templateName, Map<String,Object> dataMap){
// 获取模板
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(FileUtil.class, "/tpl");
Template t = null;
File file = new File(filePath);
try {
file.createNewFile();
t = configuration.getTemplate(templateName);
t.setEncoding("UTF-8");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(filePath),"UTF-8"));
t.process(dataMap, out);
out.close();
} catch (IOException e) {
log.error("根据xml模板用freeMarker生成word文档IO异常", e);
} catch (TemplateException e) {
log.error("根据xml模板用freeMarker生成word文档模板异常", e);
}
return file;
}

  

 /**
* 下载文件到浏览器
* @param request
* @param response
* @param filename 要下载的文件名
* @param file 需要下载的文件对象
* @throws IOException
*/
public static void downFile(HttpServletRequest request, HttpServletResponse response, String filename, File file) throws IOException {
// 文件存在才下载
if (file.exists()) {
OutputStream out = null;
FileInputStream in = null;
try {
// 1.读取要下载的内容
in = new FileInputStream(file); // 2. 告诉浏览器下载的方式以及一些设置
// 解决文件名乱码问题,获取浏览器类型,转换对应文件名编码格式,IE要求文件名必须是utf-8, firefo要求是iso-8859-1编码
String agent = request.getHeader("user-agent");
if (agent.contains("FireFox")) {
filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");
} else {
filename = URLEncoder.encode(filename, "UTF-8");
}
// 设置下载文件的mineType,告诉浏览器下载文件类型
String mineType = request.getServletContext().getMimeType(filename);
response.setContentType(mineType);
// 设置一个响应头,无论是否被浏览器解析,都下载
response.setHeader("Content-disposition", "attachment; filename=" + filename);
// 将要下载的文件内容通过输出流写到浏览器
out = response.getOutputStream();
int len = 0;
byte[] buffer = new byte[1024];
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
out.close();
}
if (in != null) {
in.close();
}
}
}
}

FreeMark导出word文件的更多相关文章

  1. java导出word文件

    java导出word文件 test5.ftl文件生存方法, 第一步:用word新建test5.doc,填写完整模板,将需导出数据用${}代替 第二步:将test5.doc另存为test5.xml 第三 ...

  2. 利用模板导出文件(二)之jacob利用word模板导出word文件(Java2word)

    https://blog.csdn.net/Fishroad/article/details/47951061?locationNum=2&fps=1 先下载jacob.jar包.解压后将ja ...

  3. vue项目前端导出word文件(bug解决)

    摘要:之前项目中导出价格表是由后端实现,前端只需要调用接口下载word即可,后来业务改变比较大,word模版需要一直改动,后端改起来相对麻烦,后来直接前端自己定义模版,实现下载word文档. 一.需要 ...

  4. java根据word模板导出word文件

    1.word模板文件处理,如下图所示在word 文档中填值的地方写入占位变量 2.将word文档另存为xml文件.编辑如下图,找到填写的占位,修改为${bcrxm}格式 3.将文件后缀名改为.ftl文 ...

  5. 利用GridView控件导出其他文件(导出Excel,导出Word文件)

    原文发布时间为:2008-10-16 -- 来源于本人的百度文章 [由搬家工具导入] // 注意,在Visual Studio2005平台下,如果使用GridView导出文件,      //就必须重 ...

  6. majingwei 利用xml导出word文件---换行

    xml不能识别<br>,需要将换行标记转换成<w:br/>

  7. 前端vue如何下载或者导出word文件和excel文件

    前端用vue怎么接收并导出文件 window.location.href = "excel地址" 如果是 get 请求,那直接换成 window.open(url) 就行了 创建一 ...

  8. SpringBoot 集成 FreeMarker 导出 Word 模板文件(底部附源码)

    思路解说 word 模板文件(doc 或 docx 文件)另存为 xml 文件 将后缀 xml 改成 html:大部分文档会改成 ftl(FreeMarker 的后缀名),因为 word 文件另存为 ...

  9. 记录一下表格用poi的导出word

    也是网上找的代码http://53873039oycg.iteye.com/blog/2152009,但是横向合并单元格没成功.只能用很蠢的办法建立了好多table public void fillT ...

随机推荐

  1. AT一万亿港元市值之差,腾讯和阿里到底“差”在哪里?

    很少有人注意到,港股之王已经悄然易主. 2019年底,阿里巴巴赴港二次上市,中国两大互联网巨头终于有了统一的比较口径,同台竞技之下,我们发现一个惊人事实--截止9月5日,港股阿里巴巴市值5.9万亿港元 ...

  2. goland 2020 去除形参提醒

    IDEA依次打开File→settings → Editor →Inlay Hints →java ,根据个人喜好 在 Show parameter name hints 选项中灵活配置即可.新版对该 ...

  3. zookeeper的管理功能

    一,查看当前zookeeper的版本 [liuhongdi@localhost ~]$ echo stat|nc 127.0.0.1 2181 Zookeeper version: 3.5.6-c11 ...

  4. faker使用

    laravel中faker的方法总结   展开 laravel faker用法总结 安装 composer require fzaninotto/faker   一.基础方法: 随机数:randomD ...

  5. Helium文档11-WebUI自动化-attach_file上传文件或图片

    前言 attach_file关键字根据官方介绍的作用是上传文件 入参介绍 def attach_file(file_path, to=None): """ :param ...

  6. C# 获取页面get过来的数据

    /// <summary> /// 获取get过来的数据 /// </summary> /// <param name="page"></ ...

  7. Java8新特性--Base64转换

    1.简介 在Java8中,Base64编码已经成为Java类库的标准.Java 8 内置了 Base64 编码的编码器和解码器. Base64工具类提供了一套静态方法获取下面三种BASE64编解码器: ...

  8. javaScript 必会基础知识

    1.JavaScript是一种浏览器解析的轻量级脚本语言. 2.html.jsp等内部js代码写在<script></script>之间:外部js文件中书写js代码不能有< ...

  9. jmeter 使用总结

    安装和启动(mac) 下载jmeter安装包并解压,进入其bin目录,执行./jmeter.sh或sh jmeter,打开就会出现如下画面 Thread Group 新建线程组,如下图 需要设置的选项 ...

  10. python中拿不到字典value值得问题解决

    在python项目的练习中,根据字典的key值get不到value值,如图所示: 最后,将user = self.allUsers.get(cardNum)改成user = self.allUsers ...