天天看點

freemark 工具類

freemark工具類,根據傳入的資料模型,生成對應的模闆檔案,如word等。。

package com.sgcc.ahepc.util;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;

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

public class WordFreeMarkerUtil {
	/**
	 * @param dataMap 資料對象
	 * @param templatePath 模闆路徑
	 * @param templateName 模闆名稱
	 * @param filePath 檔案路徑(生成檔案的路徑)
	 * @param fileName 檔案名稱
	 */
	public static void createWord(Map dataMap,String templatePath, String templateName,
			String filePath, String fileName) {
		try {
			// 建立配置執行個體
			Configuration configuration = new Configuration();

			// 設定編碼
			configuration.setDefaultEncoding("UTF-8");
			// System.out.println(WordUtil.class.getCanonicalName());
			// ftl模闆檔案統一放至 com.lun.template 包下面
			configuration.setDirectoryForTemplateLoading(new File(templatePath));
			// configuration.setClassForTemplateLoading(WordUtil.class,"ftl");

			// 擷取模闆
			Template template = configuration.getTemplate(templateName);

			// 輸出檔案
			File outFile = new File(filePath + File.separator + fileName);

			// 如果輸出目标檔案夾不存在,則建立
			if (!outFile.getParentFile().exists()) {
				outFile.getParentFile().mkdirs();
			}

			// 将模闆和資料模型合并生成檔案
			Writer out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(outFile), "UTF-8"));
			// 生成檔案
			template.process(dataMap, out);

			// 關閉流
			out.flush();
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
           

 調用的時候這樣就可以了

@RequestMapping("/exportSdxlCardWord")
	public void exportSdxlCardWord(String sdcrd_id,HttpServletRequest request,HttpServletResponse response) throws DocumentException, IOException{
		Map<String,Object> pmap = new HashMap<String, Object>();
		pmap.put("sdcrd_id", sdcrd_id);
		PmpEformSdCard card = eFormService.querySdCard(pmap);
		pmap.put("tmptcrd_type_cd", card.getTmptcrd_type_cd());
		List<Map<String,Object>> list = eFormService.querySdTemplate(pmap);
		for (Map<String, Object> map : list) {
			String content = (String) map.get("TMPTCRD_CONTENT");
			if(content == null){
				map.put("TMPTCRD_CONTENT","");
			}
		}
		Map<String,Object> dataMap = new HashMap<String, Object>();
		dataMap.put("card", card);
		dataMap.put("list", list);
		
		String basePath = request.getSession().getServletContext().getRealPath("/")
+File.separator+PropertiesUtil.get("file_up_load_path")+
File.separator+"ftl_template"+File.separator;
		String ftlPath = basePath+"ftl";
		String docPath = basePath+"doc";
		File dirPath = new File(ftlPath);
		File filePath = new File(docPath);
		if (!dirPath.exists()) {
			dirPath.mkdirs();
		}
		if (!filePath.exists()) {
			filePath.mkdirs();
		}
		WordFreeMarkerUtil.createWord(dataMap, ftlPath,
 "輸電線路專業巡檢作業卡.ftl",docPath, card.getSdcrd_name()+".doc");
		FileUtil.downFile(docPath, card.getSdcrd_name()+".doc", response);
	}
           

 還有一個重要的東東,就是ftl檔案了,這個檔案内容可以是任何形式的,基本文法很簡單的。類似于jstl的表達式,也可以循環(<#list list as dtls>)配合代碼中的list。${acptrpt.pdaptrpt_wk_dept} 這樣取得單一值。

很簡單吧。