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 文档(包含图片)的更多相关文章

  1. Java Web项目中使用Freemarker生成Word文档遇到的问题

    这段时间项目中使用了freemarker生成word文档.在项目中遇到了几个问题,在这里记录一下.首先就是关于遍历遇到的坑.整行整行的遍历是很简单的,只需要在整行的<w:tr></w ...

  2. Java Web项目中使用Freemarker生成Word文档

    Web项目中生成Word文档的操作屡见不鲜.基于Java的解决方式也是非常多的,包含使用Jacob.Apache POI.Java2Word.iText等各种方式,事实上在从Office 2003開始 ...

  3. java使用freemarker 生成word文档

      java 生成word文档     最近需要做一个导出word的功能, 在网上搜了下, 有用POI,JXL,iText等jar生成一个word文件然后将数据写到该文件中,API非常繁琐而且拼出来的 ...

  4. 使用FreeMarker生成word文档

    生成word文档的框架比较多,比如poi,java2word,itext和freemarker. 调研之后,freemarker来实现挺简单的,具体步骤如下: 1. 新建word文档,占位符用${}, ...

  5. FreeMarker生成Word文档

    FreeMarker简介: FreeMarker是一款模板引擎:即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具,它不是面向最终用户的,而是一个 ...

  6. java使用freemarker生成word文档

    1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格 ...

  7. 用 Freemarker 生成 word 文档

     阅读目录 添加图片 自定义载入模板 1.       用word写一个需要导出的word模板,然后存为xml格式. 2.       将xml中需要动态修改内容的地方,换成freemarker的 ...

  8. springboot中使用freemarker生成word文档并打包成zip下载(简历)

    一.设计出的简历模板图以及给的简历小图标切图         二.按照简历模板图新建简历word文件 :${字段名},同时将图片插入到word中,并将建好的word文件另存为xml文件:    三.直 ...

  9. 使用freemarker生成word文档处理表格数据

    1.把需要从数据库取值的字段用${}括起来,如:${busDate};2.表格数据的循环需要加标签:<#list tbl3 as tbl3>......</#list>< ...

随机推荐

  1. Encode and Decode Strings

    Design an algorithm to encode a list of strings to a string. The encoded string is then sent over th ...

  2. 转载一篇关于ios copy的文章

    由于原文创作时间较早,一些内容不实用了,我对其进行了加工,去掉了一部分内容,添加了一点注释. 原文连接 http://www.cnblogs.com/ydhliphonedev/archive/201 ...

  3. java关闭流,解压缩后的清除

    关闭流文件和file文件的时候,先打开的后关闭,后打开的先关闭,实在不行调用system.jc()方法

  4. 2016国产开源软件TOP100(Q1)

    随着互联网的发展.开放标准的普及和虚拟化技术的应用等诸多IT新领域的创新及拓展,开源技术凭借其开放性.低成本.稳定性.灵活性.安全性和技术创新性等特点迅速走向成熟,逐步发展成为一种主流模式,日益改变着 ...

  5. mysql TIMESTAMP详解

    navicat中设置timestamp字段的时间,默认这里填写CURRENT_TIMESTAMP,就是在插入数据的时候按照当前时间插入: 勾选根据当前时间戳更新,表示在UPDATE的时候,会根据当前时 ...

  6. CI当开启URL重写的时候,报错500 Internal Server Error

    Internal Server Error The server encountered an internal error or misconfiguration and was unable to ...

  7. linux下notify机制(仅用于内核模块之间的通信)

    1.通知链表简介 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣.为了满足这个需求,也即是让某个子系统在发生某个事件时通知其它的子系统,Linux内核提供了通知链的机制 ...

  8. Git Fast-forward提交

    多人协同开发,使用Git经常会看到警告信息包含术语:Fast-forward, 这是何义? 简单来说就是提交到远程中心仓库的代码必须是按照时间顺序的. 比如A从中心仓库拿到代码后,对文件f进行了修改. ...

  9. VS读取文件或写入文件时出现中文乱码问题

    最近我发现我从文本文档中读取文件处理后再存入新文本文档后,只要是有中文的都显示乱码了~~当我把中文去掉后一切又都正常了,而在我处理过程中,很确定没有对中文进行处理.使用记事本打开发现没有乱码现象,但是 ...

  10. [杂]SQL Server 之 Understanding Connection Pooling and Transactions

    A SqlConnection consists of two parts: the public instance that your code interacts with (the outer ...