Freemaker基於word模板動態導出彙總整理html
1、使用的jar包:java
2、Word模板動態導出的基本思路:瀏覽器
一、首先經過本身在word中建立好須要導出的word文本+表格的模板,模板中須要填寫內容的地方填寫${},大括號內爲後臺傳遞進來的參數名,而後將該模板另存爲xml格式;app
二、對xml格式文件進行適當的修改:工具
(1)修改${}所在的位置,讓${}在一個標籤內,由於替換值是根據${}進行識別的,所以必須讓${}在一個標籤內:編碼
(2)若是有須要循環輸出的,須要添加<#list></>標籤,相似於加強for循環,不管是表格仍是文字只要是須要循環輸出的,只要找好循環輸出數據的標籤,而後用<#list></>擴住,而後修改對應的循環輸出數據的${}參數名便可:spa
3、使用freemaker實現word模板動態導出基本步驟:.net
一、項目中引入freemaker引擎的jar包:code
二、將freemaker導出word的工具類放入項目中,並修改對應的word的xml模板所在的路徑和名稱:xml
三、編寫代碼,獲取word中須要的對應的數據,最終存儲到一個map中去(參數名必需要與word模板xml中對應的參數名保持一致):
四、編寫總方法,將map中的結果數據傳遞給工具類中的方法,實現word導出;
五、經過以上幾個步驟,變能夠實現對word的動態導出。
4、須要注意的事項:
一、word模板xml中的${}必定要放在同一個標籤中;
二、若是有須要循環輸出的數據,在後臺中每一條數據必定是放在一個對象中,不要放在一個map中,循環輸出的數據在後臺是存儲在一個list對應集合中;
三、後臺給word模板傳遞參數只能傳遞一個map參數,所以不管是單個參數仍是list對象集合,最終都整合在一個map中進行存儲;
四、後臺傳遞給word模板中的參數,不要爲null,若是是不存在的值,那麼就傳遞空字符串,也不要傳遞null進來。
5、word導出工具類代碼以下:
package com.jeecg.util; 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.net.URLEncoder; import java.util.Map; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import freemarker.template.Configuration; import freemarker.template.Template; public class WordUtils { // 配置信息,代碼自己寫的仍是很可讀的,就不過多註解了 private static Configuration configuration = null; // 這裏注意的是利用WordUtils的類加載器動態得到模板文件的位置 private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath() + "export/template/"; static { configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); try { configuration.setDirectoryForTemplateLoading(new File(templateFolder)); } catch (IOException e) { e.printStackTrace(); } } private WordUtils() { throw new AssertionError(); } public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,String fileName) throws IOException { Template freemarkerTemplate = configuration.getTemplate("TMCatalogMainTemplateBatchDown.xml"); File file = null; InputStream fin = null; ServletOutputStream out = null; try { // 調用工具類的createDoc方法生成Word文檔 file = createDoc(map, freemarkerTemplate); fin = new FileInputStream(file); response.setCharacterEncoding("utf-8"); response.setContentType("application/msword"); // 設置瀏覽器如下載的方式處理該文件名 fileName = fileName+".doc"; response.setHeader("Content-Disposition", "attachment;filename=".concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8")))); out = response.getOutputStream(); byte[] buffer = new byte[512]; // 緩衝區 int bytesToRead = -1; // 經過循環將讀入的Word文件的內容輸出到瀏覽器中 while ((bytesToRead = fin.read(buffer)) != -1) { out.write(buffer, 0, bytesToRead); } } finally { if (fin != null) fin.close(); if (out != null) out.close(); if (file != null) file.delete(); // 刪除臨時文件 } } private static File createDoc(Map<?, ?> dataMap, Template template) { String name = "test.doc"; File f = new File(name); Template t = template; try { // 這個地方不能使用FileWriter由於須要指定編碼類型不然生成的Word文檔會由於有沒法識別的編碼而沒法打開 Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8"); t.process(dataMap, w); w.close(); } catch (Exception ex) { ex.printStackTrace(); throw new RuntimeException(ex); } return f; } }
6、導出多個word的壓縮包,思路詳情和代碼見鏈接: