Freemarker + XML 導出Word

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

相關文章
相關標籤/搜索