用 Freemarker 生成 word 文档(包含图片)
1. 用word写一个需要导出的word模板,然后存为xml格式。
2. 将xml中需要动态修改内容的地方,换成freemarker的标识符,例如:
<w:p wsp:rsidR="00D02906" wsp:rsidRDefault="00FA4C58" wsp:rsidP="00FA4C58">
<w:pPr>
<w:jc w:val="center"/>
<w:rPr>
<w:rFonts w:hint="fareast"/>
</w:rPr>
</w:pPr>
<w:r>
<w:t>${year}</w:t>
</w:r>
<w:r>
<w:rPr>
<wx:font wx:val="宋体"/>
</w:rPr>
<w:t>年度工作报告</w:t>
</w:r>
</w:p>
3. 用代码生成:
import freemarker.template.Configuration;
import freemarker.template.Template; import java.io.*;
import java.util.HashMap;
import java.util.Map; /**
* @Class name: CreateDoc
* <p/>
* Short description on the purpose of the program.
* @author : youfeng
* @modified : 8/29/11
*/
public class CreateDoc { private Configuration configuration = null; public CreateDoc() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
} public void create() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2011");
map.put("modifyDate", "2011/8/29");
map.put("modifyUser", "Zhu You Feng"); configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/");
Template t = configuration.getTemplate("doc1.ftl");
File outFile = new File("D:/outFile.doc");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
t.process(map, out);
} public static void main(String[] args) throws Exception {
new CreateDoc().create(); }
}
添加图片
如果你需要在word中添加图片,那你就在第一步制作模板时,加入一张图片占位,然后打开xml文档,可以看到如下的一片base64编码后的代码:
1 <w:binData w:name="wordml://03000001.png" xml:space="preserve">iVBORw0…(很省略很省略)…CC</w:binData>
只要将base64的代码替换成例如:${image},如下:
1 <w:binData w:name="wordml://03000001.png" xml:space="preserve">${image}</w:binData>
这里要注意“>${image}<”这尖括号中间不能加任何其他的诸如空格,tab,换行等符号。
然后用代码生成:
import freemarker.template.Configuration;
import freemarker.template.Template;
import sun.misc.BASE64Encoder; import java.io.*;
import java.util.HashMap;
import java.util.Map; /**
* @Class name: CreateDoc
* @author: youfeng
* @modified: 8/29/11
*/
public class CreateDocWithImage { private Configuration configuration = null; public CreateDocWithImage() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
} public void create() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("year", "2011");
map.put("person", "Zhu You Feng");
map.put("image", getImageStr()); configuration.setClassForTemplateLoading(this.getClass(), "/docTemplate/");
Template t = configuration.getTemplate("doc2.ftl");
File outFile = new File("D:/outFile.doc");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
t.process(map, out);
} private String getImageStr() {
String imgFile = "d:/test.jpg";
InputStream in = null;
byte[] data = null;
try {
in = new FileInputStream(imgFile);
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) throws Exception {
new CreateDocWithImage().create(); }
}
自定义载入模板
import freemarker.cache.TemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import sun.misc.BASE64Encoder; import java.io.*;
import java.util.HashMap;
import java.util.Map; public class DocumentGenerator {
private Configuration configuration = null; public static void main(String[] args) throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("date", "2012");
map.put("modifyDate", "2011/8/29");
map.put("modifyUser", "Zhu You Feng");
new DocumentGenerator().createDoc("", "D:/outFile2.doc", map);
} public DocumentGenerator() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassicCompatible(true);
configuration.setTemplateLoader(new ByteArrayStreamTemplateLoader(new ByteArrayInputStream(
getBytesFromFile(new File("D:/ownProject/freemarkerToDoc/src/main/resources/docTemplate/doc1.ftl"))
)));
} /**
* @param fileName
* @param outFileName
* @param dataMap
*/
public void createDoc(String fileName, String outFileName, Map dataMap) {
Template t = null;
try {
t = configuration.getTemplate(fileName);
} catch (IOException e) {
e.printStackTrace();
}
File outFile = new File(outFileName);
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile)));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
try {
t.process(dataMap, out);
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} public byte[] getBytesFromFile(File f) {
if (f == null) {
return null;
}
try {
FileInputStream stream = new FileInputStream(f);
ByteArrayOutputStream out = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = stream.read(b)) != -1)
out.write(b, 0, n);
stream.close();
out.close();
return out.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
} class ByteArrayStreamTemplateLoader implements TemplateLoader { InputStream in = null; public ByteArrayStreamTemplateLoader(ByteArrayInputStream inputStream) {
in = inputStream;
} public Object findTemplateSource(String name) throws IOException {
System.out.println("findTemplateSource");
return in;
} public long getLastModified(Object templateSource) {
return 0;
} public Reader getReader(Object templateSource, String encoding) throws IOException {
System.out.println("getReader");
return new InputStreamReader(in);
} public void closeTemplateSource(Object templateSource) throws IOException {
System.out.println("closeTemplateSource");
if (in != null) {
in.close();
}
}
}
本文转自:http://www.cnblogs.com/zhuyoufeng/archive/2011/09/01/2161558.html
用 Freemarker 生成 word 文档(包含图片)的更多相关文章
- Java Web项目中使用Freemarker生成Word文档遇到的问题
这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ...
- Java Web项目中使用Freemarker生成Word文档
Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...
- java使用freemarker 生成word文档
java 生成word文档 最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ...
- 使用FreeMarker生成word文档
生成word文档的框架比较多,比如poi,java2word,itext和freemarker. 调研之后,freemarker来实现挺简单的,具体步骤如下: 1. 新建word文档,占位符用${}, ...
- FreeMarker生成Word文档
FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个 ...
- java使用freemarker生成word文档
1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格 ...
- 用 Freemarker 生成 word 文档
阅读目录 添加图片 自定义载入模板 1. 用word写一个需要导出的word模板,然后存为xml格式. 2. 将xml中需要动态修改内容的地方,换成freemarker的 ...
- springboot中使用freemarker生成word文档并打包成zip下载(简历)
一.设计出的简历模板图以及给的简历小图标切图 二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件: 三.直 ...
- 使用freemarker生成word文档处理表格数据
1.把需要从数据库取值的字段用${}括起来,如:${busDate};2.表格数据的循环需要加标签:<#list tbl3 as tbl3>......</#list>< ...
随机推荐
- 《转载》三年建站之路走得一事无成 今来A5撞墙反思
本文转载自A5站的蚕丝被.如果给站长带来不便之处,请联系博主. 时间过得真快,记得上一次在A5写文章已经是一年前的事了,这其中是有原因的,今天就跟大家来聊聊三年来个人失败经历的撞墙反思,也给一些有着同 ...
- MQTT——安装、测试
MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用 http://blog.csdn.net/xukai871105/article/details/39252653 ...
- 对于sharepoint 的解决方案的实际说明
对于sharepoint 的解决方案 实际上就是cab的包 你把***.wsp改为***.cab我们就可以查看这个包中的所有内容了
- HDU 5044(2014 ACM-ICPC上海网络赛)
题意:给定一个树形图,节点10^5,有两种操作,一种是把某两点间路径(路径必定唯一)上所有点的权值增加一个固定值. 另一种也是相同操作,不同的是给边加权值.操作次数10^5.求操作过后,每个点和每条边 ...
- Java for LeetCode 035 Search Insert Position
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- 13.python笔记之pyyaml模块
Date:2016-03-25 Title:13.Python笔记之Pyymal模块使用 Tags:Python Category:Python 博客地址:www.liuyao.me 作者:刘耀 YA ...
- 桐桐的贸易--WA
问题 A: 桐桐的贸易 时间限制: 1 Sec 内存限制: 64 MB提交: 15 解决: 2[提交][状态][讨论版] 题目描述 桐桐家在Allianceance城,好友ROBIN家在Horde ...
- HTML、CSS选择题
Java EE软件工程师认证考试 试题库-选择题 一. 选择题(包括单选和双选) 1.D 以下( )是HTML常用的块状标签(选择一项) A. <span> B. < ...
- MFC 密码框
使用Edit Control 在属性面板中,设置“行为”为password
- CSDN客户端实现
本文主要讲解实现了一个CSDN的安卓客户端,主要知识点如下 java爬虫获取网页数据 将java程序打包成jar包 Fragment+viewpager+TabPageIndicator实现Tab效果 ...