一、建立Word模板文档,如 html
二、设置Word模板的常量值(以Map形式输出,这里设置其key值),如 java
三、将Word模板文档另存为XML格式,如 app
四、将xml文件后缀名,转为ftl,即andy.ftl。ftl文件能够用“foxe_CHS.exe”工具打开。 工具
这里要注意两点:①肯定你定义的key没有被‘分解’,若是被分解,要删除中间的部分。正确的写法是在“<w:t>”,"</w:t>"之间是你定义的key值,如本例中的${username}。 测试
②若是你的模板中有图片文件,系统会在“<w:binData>",“</w:binData>"中间生成 this
很长很长的二进制(看不懂的)代码。正确的写法是,只须要把那些看不懂的代码删掉,写成你定义的key spa
便可,如本例中的${image}。 code
以上步骤作完,就能够导出Word文档了。具体代码以下: xml
/** * @包名 :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的几种档案”,这篇文档中详细地介绍了每种方法的优缺点, htm