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. Recover Rotated Sorted Array

    Given a rotated sorted array, recover it to sorted array in-place. Clarification What is rotated arr ...

  2. Xenomai 安装准备工作

    一些安装xenomai的参考资料: http://my.oschina.net/hevakelcj/blog/124290 http://blog.sina.com.cn/s/blog_60b9ee1 ...

  3. 70 数组的Kmin算法和二叉搜索树的Kmin算法对比

    [本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array-vs-kmin-of-bst.html [分析] 数组的Kmin算法和二叉搜索树的Km ...

  4. MySQL自带information_schema数据库使用

    MySQL的information_schema数据库是什么,有什么作用? 大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个 information_schema数据库.info ...

  5. msysgit ls 中文显示

    2013年10月17日 14:54:15 安装了新版的msysgit后,在其自带的 git bash 命令行下就可以输入中文汉字了 但是创建了中文名字命名的文件后,再用 ls 命令查询时会出现乱码的情 ...

  6. 浅谈mysql集群

    一.什么是MySQL集群 MySQL集群是一个无共享的(shared-nothing).分布式节点架构的存储方案,其目的是提供容错性和高性能. 数据更新使用读已提交隔离级别(read-committe ...

  7. Windows下配置Tomcat服务器

    Tomcat服务器是Apache开源基金会的一个项目,tomcat不仅能作为静态文件的服务器,也可以作为JSP/Servlet的web容器,而且使用广泛,性能也不错,那么下面来配置一个基本的基于tom ...

  8. object-c学习笔记

    原文地址 最近开始学习object-c,分享一下学习oc的经验以及对oc的理解,其中难免会有错误,请大家理解. 对初学者来说,objective-c存在了很多令人费解的写法,当然也包括我! 我刚开始看 ...

  9. GLSL

    变量修饰符 修饰符给出了变量的特殊含义,GLSL中有如下修饰符: ·const – 声明一个编译期常量. ·attribute– 随不同顶点变化的全局变量,由OpenGL应用程序传给顶点shader. ...

  10. mongoose学习笔记1--基础知识2

    Schema简述 Schema —— 一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力,仅仅只是数据库模型在程序片段中的一种表现,可以说是数据属性模型(传统 ...