1、创建Word模板文档,如
2、设置Word模板的常量值(以Map形式输出,这里设置其key值),如
3、将Word模板文档另存为XML格式,如
4、将xml文件后缀名,转为ftl,即andy.ftl。ftl文件可以用“”工具打开。
这里要注意两点:①确定你定义的key没有被‘分解’,如果被分解,要删除中间的部分。正确的写法是在“<w:t>”,"</w:t>"之间是你定义的key值,如本例中的${username}。
②如果你的模板中有图片文件,系统会在“<w:binData>",“</w:binData>"中间生成
很长很长的二进制(看不懂的)代码。正确的写法是,只需要把那些看不懂的代码删掉,写成你定义的key
即可,如本例中的${image}。
以上步骤做完,就可以导出Word文档了。具体代码如下:
/** * @包名 :com.andy.freemarker * @文件名 :ReportWord.java * @类描述 : * @作者 :Andy.wang * @创建时间 :2014-6-17上午11:49:14 * @更改人 : * @更改时间 : */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 * @文件名 :ReportWord.java * @类描述 :Freemarker + XML 导出Word * @作者 :Andy.wang * @创建时间 :2014-6-17上午11:49:14 * @更改人 : * @更改时间 : */public class ReportWord { private Configuration configuration = null; private MapdataMap = null; /** * 初始化参数 */ public ReportWord(Map dataMap) { // TODO Auto-generated constructor stub configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); this.dataMap = dataMap; } /** * * @方法名 :createDoc * @方法描述 :生成文档 * @创建者 :Andy.wang * @创建时间 :2014-6-18上午10:23:48 * 返回类型 :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 * @方法描述 :将图片转化为二进制流 * @创建者 :Andy.wang * @创建时间 :2014-6-18上午10:23:00 * @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 dataMap = new HashMap (); 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。推荐一篇文档“”,这篇文档中详细地介绍了每种方法的优缺点,