一、建立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