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} 這樣取得單一值。
很簡單吧。