Freemarker + XML 导出Word

て烟熏妆下的殇ゞ 提交于 2020-04-14 10:24:45

【推荐阅读】微服务还能火多久?>>>

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的几种档案”,这篇文档中详细地介绍了每种方法的优缺点,

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!