1. 程式人生 > >利用Freemarker生成word的使用(java)

利用Freemarker生成word的使用(java)

首先向客戶獲得一份平時需要的word模板,將需要用程式填寫的資料使用能夠區分的字母,如XXXXX。

第二步就是把word模板(必須採用word2003製作模板),轉化為xml檔案(word可以另存為xml的),用EditorPlus等工具開啟,注意字元編碼,word的字元編碼為utf-8,所以開啟是最好是先不要改動,先看編碼是否正確(不正確的改下字元編碼),然後格式化一下xml檔案,格式化後方便閱讀(格式化,網上有很多線上格式化工具),然後尋找你剛才在word中留下的標記,把他們換成freemarker標記,其語法跟struts語法基本一致。

     比如:

1、向freemarker傳遞一個物件,提取一個物件的屬性值可以寫成${report.planName}。

2、向freemarker傳遞一個集合,遍歷一個集合可以:

<#listtable1_tr as  table1_td>  //遍歷開始

${table1_td}//輸出值

</#list>  //遍歷結束

       3、如果遍歷一個二維的集合


       4、定義一個變數<#assignx=0 />

       5、判斷物件是否為空

       <#ifQA.question??>

           ${QA.question}

       </#if>


第三步輸出word,如:


示例

Word模板是這樣的


XMl是這樣的:


接下來我們使用freemarker標記性語言對動態變化的資料進行處理,由簡到難,我們先替換列表資料之外的資料, 每個標記不相同就行。如:



接下來我們替換列表資料,使用<#list>標籤進行替換

在列表資料開頭寫<#list>


結尾寫</#list>


替換中間部分


然後儲存:

我的xml的儲存檔名叫test2.xml.等下會用到這個

接下來開始寫程式:

首先你要有這些;就是freemarker的開源包,百度一個,匯入就好,

import freemarker.template.Configuration;

import freemarker.template.Template;

import freemarker.template.TemplateException;


TheFreemarker類:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;


public class TheFreemarker {
	private Configuration configuration = null;

	public TheFreemarker() {
		configuration = new Configuration();
		configuration.setDefaultEncoding("UTF-8");
	}

	public void createDoc() {
		// 要填入模本的資料檔案
		Map dataMap = new HashMap();
		getData(dataMap);
		// 設定模本裝置方法和路徑
		// 這裡我們的模板是放在src.model包下面
		configuration.setClassForTemplateLoading(this.getClass(),
				"model");
		Template t = null;
		try {
			t = configuration.getTemplate("test2.xml");	// 裝載test2.xml模板
		} catch (IOException e) {
			e.printStackTrace();
		}
		// 輸出文件路徑及名稱
		File outFile = new File("D:/outFileDoc.doc");
		Writer out = null;
		try {
			out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(outFile),"utf-8"));
		} catch (Exception e1) {
			e1.printStackTrace();
		}

		try {
			t.process(dataMap, out);
		} catch (TemplateException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	/**
	 * 注意dataMap裡存放的資料Key值要與模板中的引數相對應
	 * @param dataMap
	 */
	private void getData(Map dataMap) {
		dataMap.put("name", "小新與小白");//姓名 xml裡的標記為${name}
		dataMap.put("Tdate", "2011-12-02");//時間 xml裡的標記為${Tdate}
	dataMap.put("address", "北京海淀區");//時間 xml裡的標記為${address}
		List table2 = new ArrayList();
		for (int i = 0; i < 5; i++) {
			Table2 t = new Table2();
			t.setApplyno("BBBBBBBB-BB");
			t.setCustname("小新");
			t.setLoandate("2012-12-12");
			t.setRegion("999-999");
			table2.add(t);
		}
		dataMap.put("table2", table2);
	}

Table2 為:

public class Table2 {
	private String applyno;

	private String custname;

	private String loandate;

	private String region;

	public String getApplyno() {
		return applyno;
	}

	public void setApplyno(String applyno) {
		this.applyno = applyno;
	}

	public String getCustname() {
		return custname;
	}

	public void setCustname(String custname) {
		this.custname = custname;
	}

	public String getLoandate() {
		return loandate;
	}

	public void setLoandate(String loandate) {
		this.loandate = loandate;
	}

	public String getRegion() {
		return region;
	}

	public void setRegion(String region) {
		this.region = region;
	}

測試類:

public class Pptest {
	public static void main(String[] args) {
		TheFreemarker tf=new TheFreemarker();
		tf.createDoc();
	}

}

執行結果:


說明

公用事業呼叫中心的質檢簡報模板製作,需要保證每個資料的名字不變,如果想改變需要自行修改後臺程式碼及相應的實體類

實體類:com.haiyisoft.vo.entity.cc.repo.QCBriefReport 

       com.haiyisoft.vo.entity.cc.repo.QCBriefReportQATable


相關文章