使用FreeMarker生成Word文檔
FreeMarker簡介:
FreeMarker是一款模板引擎:即一種基於模板和要改變的數據,並用來生成輸出文本(HTML網頁、電子郵件、配置文件、源代碼等)的通用工具,它不是面向最終用戶的,而是一個Java類庫,是一款程序員可以嵌入他們所開發產品的組件。
FreeMarker是免費的,基於Apache許可證2.0版本發布。其模板編寫為FreeMarker Template
Language(FTL),數據簡單、專用的語言。需要準備數據在真實編程語言中來顯示,比如數據庫查詢和業務運算,之後模板顯示已經準備好的數據。在模板中,主要用於如何展示數據,而在模板之外註意於要展示什麽數據。
1、實例是maven工程,工程對jar包的依賴,pom.xml中主要的依賴是對freemarker的包依賴
<!-- freemarker依賴 --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency> </dependencies>
2、maven工程的目錄,其中com.freemarker.template包中存放的模板文件,例如本實例中的resume.ftl文件
3、我們所需要的模板.ftl文件是從哪裏來的呢?(本例中的resume.ftl)其中很簡單,FreeMarker是模板引擎,所以我們首先要一個模板,生成word文檔當然也不例外,我們先新建一個word文件,然後把需要的改變的字段賦一個標識位,如Flag1、Flag2,方便後面替換
把該word文檔另存為XML文件:
另存後建議用用Editplus、Notepad++、Sublime等工具打開查看一下(樓主用的Editplus)。復制文件內容,在線格式化化一下,然後覆蓋原文件內容
找到之前的標識位,然後替換成${name}、${age}等
4、好了,前期的準備工作都完成了,現在開始功能的實現了
工具類代碼:
package com.freemarker.util; import com.freemarker.bean.Resume; import freemarker.template.Configuration; public class FreemarkerConfig { private static Configuration configuration = null; static { configuration = new Configuration(Configuration.VERSION_2_3_0); configuration.setDefaultEncoding("UTF-8"); configuration.setClassForTemplateLoading(Resume.class, "/com/freemarker/template"); // configuration.setTemplateLoader(new FileTemplateLoader(new // File("F:/temp/"))); } public static Configuration getConfiguation() { return configuration; } }
package com.freemarker.util; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; /** * 生成doc文件工具類 * * @author xuwenjin */ public class OutputDoc { /** * 生成doc文件 * * @param tempName * 模板文件名 * @param docName * 生成的doc文件名 * @param variables * 變量 * @return */ public static void makeDoc(String tempName, String docName, Map<String, Object> variables) { String output = "uploadFiles" + File.separator + new SimpleDateFormat("yyyy/MM/dd").format(new Date()) + File.separator; File f = new File(output); if (!f.exists()) { f.mkdirs(); } output = (output + docName + ".doc").replaceAll("\\\\", "/"); try { Configuration cfg = FreemarkerConfig.getConfiguation(); Template temp = cfg.getTemplate(tempName + ".ftl"); Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(output)), "UTF-8")); temp.process(variables, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { Map<String, Object> variables = new HashMap<>(); variables.put("name", "張三"); variables.put("sex", "男"); variables.put("age", "28"); variables.put("phone", "1234567"); variables.put("mail", "[email protected]"); variables.put("education", "本科"); makeDoc("resume", "xuwenjin", variables); } }
5、執行OutputDoc中的main方法,刷新下工程,會發現工程多了個文件夾uploadFiles
雙擊xuwenjin.doc,查看生成的word文件,如下圖:
本文源碼的地址:https://github.com/xuwenjin/xwj_repo/tree/master/com.freemarker
相關參考資料:
SpringMVC中使用FreeMarker生成Word文檔
Freemarker中Configuration的setClassForTemplateLoading方法參數問題
使用FreeMarker生成Word文檔