1.word模板:xx.ftl生成,ftl文件就是word的源代碼,類似html一樣是擁有標簽和樣式的代碼。
- 把需要導出的doc文件模板用office版本的word工具打開。
- 把doc文件另存為xx.xml文件
- 把xx.xml文件重命名為xx.ftl文件
2.編寫后台代碼,生成word文件
package com.server.common.util.word; import java.io.*; 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; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @Service public class WordUtils { //配置信息,代碼本身寫的還是很可讀的,就不過多注解了 private static Configuration configuration = null; //這里注意的是利用WordUtils的類加載器動態獲得模板文件的位置 private static String path = null; //這是word模板的存放位置private String templateFolder; //這是生成word的路徑private String reportPath; private boolean connection(HttpServletRequest request) { try { System.out.println(templateFolder); configuration = new Configuration(); configuration.setDefaultEncoding("utf-8"); configuration.setDirectoryForTemplateLoading(new File(templateFolder)); return true; } catch ( IOException e ) { e.printStackTrace(); return false; } } /** * * @param request * @param response * @param map 數據集合 * @param title 生成的word名字 * @param ftlFile word模板的名字 * @throws IOException */ public void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map, String title, String ftlFile) throws IOException { if (connection(request) == false) { return; } Template freemarkerTemplate = configuration.getTemplate(ftlFile); File file = null; InputStream fin = null; ServletOutputStream out = null; try { // 調用工具類的createDoc方法生成Word文檔 file = createDoc(title, map, freemarkerTemplate); fin = new FileInputStream(file); response.setCharacterEncoding("utf-8"); response.setContentType("application/msword"); // 設置瀏覽器以下載的方式處理該文件名 String fileName = title + ".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(); // 刪除臨時文件 } } /** * * @param name //生成的word名字 * @param dataMap //生成的word的數據 * @param template //獲取模板后實例 * @return */ private File createDoc(String name, Map<?, ?> dataMap, Template template) { File f = new File(reportPath + 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; } }
3.ftl文件賦值,ftl賦值和el表達式很相似都是${}模式
${data.name} :字符串
${data.name!"-"}:代表當data.name是空的時候用“-”代替這個字符展示
${data.name?html}:轉化為html格式
if判斷
??代表的是?前方的字符不是空的時候,?size常用語list數據,判斷?前方數據的size是不是小於0 <#if data.list?? && (data.list?size > 0) > 和if是功效是一樣的 <# else if (data.list?size < 10) > </#if>
list循環輸出
<#list data.list as list>
${list_index} :表示集合的位置或者下標,初始為0
</#list>
ftl標簽
<w:vMerge w:val="restart"/>:表示要合並單元格 <w:vMerge w:val="continue"/>:表示被合並的單元格 <w:t xml:space="preserve">:表示需要格式化的特殊字符
