文档章节

Freemarker + XML 导出Word

Andy市民
 Andy市民
发布于 2014/06/18 11:44
字数 759
阅读 185
收藏 3

1、创建Word模板文档,如

2、设置Word模板的常量值(以Map形式输出,这里设置其key值),如

3、将Word模板文档另存为XML格式,如

4、将xml文件后缀名,转为ftl,即andy.ftl。ftl文件可以用“foxe_CHS.exe”工具打开。

这里要注意两点:①确定你定义的key没有被‘分解’,如果被分解,要删除中间的部分。正确的写法是在“<w:t>”,"</w:t>"之间是你定义的key值,如本例中的${username}。

                     ②如果你的模板中有图片文件,系统会在“<w:binData>",“</w:binData>"中间生成

很长很长的二进制(看不懂的)代码。正确的写法是,只需要把那些看不懂的代码删掉,写成你定义的key

即可,如本例中的${image}。

以上步骤做完,就可以导出Word文档了。具体代码如下:

/**
 * @包名 :com.andy.freemarker<br>
 * @文件名 :ReportWord.java<br>
 * @类描述 :<br>
 * @作者 :Andy.wang<br>
 * @创建时间 :2014-6-17上午11:49:14<br>
 * @更改人 :<br>
 * @更改时间 :<br>
 */
package com.andy.freemarker;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import sun.misc.BASE64Encoder;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * @包名 :com.andy.freemarker<br>
 * @文件名 :ReportWord.java<br>
 * @类描述 :Freemarker + XML 导出Word<br>
 * @作者 :Andy.wang<br>
 * @创建时间 :2014-6-17上午11:49:14<br>
 * @更改人 :<br>
 * @更改时间 :<br>
 */
public class ReportWord {
	private Configuration configuration = null;
	private Map<String, Object> dataMap = null;
	
	/**
	 * 初始化参数
	 */
	public ReportWord(Map<String, Object> dataMap) {
		// TODO Auto-generated constructor stub
		configuration = new Configuration();
		configuration.setDefaultEncoding("utf-8");
		this.dataMap = dataMap;
	}
	
	/**
	 * 
	 * @方法名 :createDoc<br>
	 * @方法描述 :生成文档<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2014-6-18上午10:23:48 <br>
	 * 返回类型 :void
	 */
	public void createDoc(){
		// 配置模板所在的包名
		configuration.setClassForTemplateLoading(this.getClass(), "/com/andy/freemarker/report");
		Template t = null;
		Writer out = null; 
		
		// 将模板输入到本地的硬盘上
		try {
			// 加载模板
			t = configuration.getTemplate("andy123.ftl");
			t.setEncoding("utf-8");
			
			File outFile = new File("d:/hehe.doc");
			out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"));
			
			t.process(dataMap, out);
			out.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (TemplateException e) {
			e.printStackTrace();
		}
		
		// 以下代码在Web项目中,输出到页面,弹出”保存“对话框
//		try {
//			ActionContext ctx = ActionContext.getContext();
//			HttpServletResponse response = (HttpServletResponse) ctx
//			.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse");
//			response.setContentType("application/msword");
//			response.addHeader("Content-Disposition", "attachment; filename="
//					+ URLEncoder.encode("hehe.doc", "UTF-8"));
//			response.setCharacterEncoding("utf-8");
//			
//			PrintWriter pout = response.getWriter();
//			t.process(dataMap, pout);
//			out.close();
//			
//		} catch (TemplateException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
		
		
	}
	
	/**
	 * 
	 * @方法名 :getImageStr<br>
	 * @方法描述 :将图片转化为二进制流<br>
	 * @创建者 :Andy.wang<br>
	 * @创建时间 :2014-6-18上午10:23:00 <br>
	 * @return
	 * 返回类型 :String
	 */
	public static String getImageStr() {
		// 测试,将本机中的图片输出到Word文档中
        String imgFile = "d:/qw.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) {
		// 模板的数据源(key就是模板中已定义好的key,value值一定不能为空)
		Map<String, Object> dataMap = new HashMap<String, Object>();
		dataMap.put("username", "Andy");
		dataMap.put("usersex", "男");
		dataMap.put("userbirthday", "1989-6");
		dataMap.put("image", getImageStr());
		
		new ReportWord(dataMap).createDoc();
	}
}

小结:除此之外,导出Word文档,还有jacob(微软)、poi(Apache)、itext、JSP。推荐一篇文档“Java生成Word的几种档案”,这篇文档中详细地介绍了每种方法的优缺点,

© 著作权归作者所有

共有 人打赏支持
Andy市民
粉丝 8
博文 36
码字总数 32858
作品 0
房山
程序员
私信 提问
加载中

评论(1)

a
aikan1990
学习了!
使用freemarker生成word文档

项目有时候需要将一些内容导出成word格式,实现方式很多种,如:POI导出,freemarker导出。freemarker导出比较简单。 主要分三步: 新建一个word文档 生成模板 动态生成word。 新建一个word文...

leesama
2014/05/01
0
3
用Freemarker导出word文档

1、 用word写一个需要导出的模板,将需要动态修改的内容替换成***。如果需要在word中添加图片,需要加入一张图片占位,然后另存为xml格式,后缀名修改为.ftl。 注意:(1)编写模板时应使用M...

枫林茵然
2012/11/02
0
0
利用itext导出word表格,处理图片

在实际的项目开发中我们需要将后台大量数据导出为word或者是excel方便用户操作,当然能完成这一功能的有freemarker,itext,poi等技术,本文讲述以itext导出word。 首先我们需要明白的是无论...

小夜的传说
06/26
0
0
使用FreeMark导出数据到Excle表格

一、使用freemarker时需要的jar包:freemarker-2.3.19.jar。 二、根据需求做出导出模板 做出Excle模板 这个没什么说的,直接按照需求做出Excle模板,如下:(这里建议用Excle,别用WPS。后面...

你我青春时
2014/06/04
0
0
使用Freemarker生成Word

场景: 需要通过模板动态生成word,模板中包括普通字符串和表格 实现方法: 需要:Freemarker 下载 1、将word模板另存为xml格式,将需要替换的地方使用标签和指令替换,具体参照Freemarker开...

liweigov
2012/06/26
0
20

没有更多内容

加载失败,请刷新页面

加载更多

腾讯与Github的魔幻会面背后的故事…

10月22日,腾讯开源管理办公室有幸邀请到Github新晋CEO Nat Friedman,前来鹅厂参观交流。目前腾讯已经有近70个项目在Github上开源,共获得17w stars,世界排名11位。Github是腾讯开源的主阵...

腾讯开源
22分钟前
1
0
单例模式

单例模式(Singleton pattern)属于创建型设计模式。 保证一个类仅有一个实例,并提供一个访问它的全局访问点。 通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对...

NinjaFrog
27分钟前
0
0
TypeScript基础入门之装饰器(三)

转载 TypeScript基础入门之装饰器(三) 继续上篇文章[TypeScript基础入门之装饰器(二)] 访问器装饰器 Accessor Decorator在访问器声明之前声明。 访问器装饰器应用于访问器的属性描述符,可用...

durban
44分钟前
2
0
spring5调研学习(转载)

Spring框架的新功能 这一章主要提供Spring框架新的功能和变更。 升级到新版本的框架可以参考。Spring git。 内容列表 Spring 5.x框架新的功能 Spring 4.x框架新的功能 Spring 3.x框架新的功能...

小海bug
54分钟前
2
0
为何Spring框架能这么流行?

想要学习更多关于Spring框架在Java开发者中如此流行?看这篇文章可以学到更多! Spring框架特性 Spring是用于应用开发中的一款强大,轻量级框架。更广泛地说,你可以认为Spring框架是一个定义...

java知识分子
57分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部