文档章节

Freemarker + XML 导出Word

Andy市民
 Andy市民
发布于 2014/06/18 11:44
字数 759
阅读 178
收藏 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市民
粉丝 7
博文 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
使用Freemarker生成Word

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

liweigov
2012/06/26
0
20
使用FreeMark导出数据到Excle表格

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

你我青春时
2014/06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

jetbrains系产品IDEA:mac上面提示快捷键设置

原因 由于Mac上面的Ctrl+空格变成输入法切换的快捷键,在使用IDEA的过程中,代码提示很不方便,需要使用option+/这种传统eclipse上面的代码提示快捷键作为主要快捷键。 怎么修改? 移除【opt...

亚林瓜子
33分钟前
0
0
Exclipse 输出结果时换行

System.out.println(f1 + "\n" + d1 + "\n" + d2);

笑丶笑
33分钟前
1
0
怎样治疗标签不能触发onblur事件

I realize this was over a year ago, but it showed up for me in Google while trying to solve this same issue. It seems Chrome does not consider some elements, like body and ancho......

Weijuer
37分钟前
0
0
vue常见库安装

移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击。为了能够立即响应用户的点击事件,才有了FastClick。 安装fastclick npm insta...

林夏夕
39分钟前
0
0
kafka 教程(三) kafka Java API 编程

下午写

MrPei
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部