1、前言
jeecg 中已經自帶 word 的導出導出功能,其所使用的也是 easypoi,盡管所導出的 word 能滿足大部分需求,
但總是有需要用到自定義 word導出模板,下文所用到的皆是 easypoi 提供的,為方便下次翻閱,故記之。
2、代碼部分
2.1、controller
@RequestMapping("/ftl2word") public void velocity2word(JeecgDemoExcelEntity jeecgDemoExcel, HttpServletRequest request, HttpServletResponse response) throws IOException { try { jeecgDemoExcel = this.jeecgDemoExcelService.getEntity(JeecgDemoExcelEntity.class, jeecgDemoExcel.getId()); List<Map<String, Object>> departs = this.systemService.findForJdbc("select id,departname from t_s_depart"); String docFileName = "word-模板導出測試.doc"; Map<String, Object> rootMap = new HashMap<String, Object>(); rootMap.put("info", jeecgDemoExcel); rootMap.put("departs", departs); // FreemarkerUtil.createFile("exportMyExcel.xls", // docFileName,rootMap, request, response, // FreemarkerUtil.EXCEL_FILE); FreemarkerUtil.createFile("ftl2doc.ftl", docFileName, rootMap, request, response, FreemarkerUtil.WORD_FILE); } catch (Exception e) { e.printStackTrace(); } }
2.2、entity
實體就不扔出來了,詳細說一下這個地方:
jeecgDemoExcel = this.jeecgDemoExcelService.getEntity(JeecgDemoExcelEntity.class, jeecgDemoExcel.getId()); List<Map<String, Object>> departs = this.systemService.findForJdbc("select id,departname from t_s_depart"); String docFileName = "word-模板導出測試.doc"; Map<String, Object> rootMap = new HashMap<String, Object>(); rootMap.put("info", jeecgDemoExcel); rootMap.put("departs", departs);
jeecgDemoExcel 為 List<實體>,departs 為 List<Map<String, Object>>,怎么用?ftl 語法了解一下?
2.3、工具類 FreemarkerUtil
public class FreemarkerUtil { private static final Object LOCK = new Object(); /** * word文件 */ public static final int WORD_FILE = 1; /** * excel文件 */ public static final int EXCEL_FILE = 2; private static Configuration cfg; private static FreemarkerUtil ftl ; private FreemarkerUtil(String templateFolder) throws IOException { cfg = new Configuration(); cfg.setDirectoryForTemplateLoading(new File(templateFolder)); cfg.setObjectWrapper(new DefaultObjectWrapper()); } private static void check(HttpServletRequest request) { if (ftl == null) { synchronized (LOCK) { try { ftl = new FreemarkerUtil(request.getServletContext().getRealPath("/")+"export/template"); } catch (IOException e) { e.printStackTrace(); } } } } /** * 創建 word 文檔 * 必須先設置response導出配置,然后解析模版,否則會出問題 * @throws IOException */ public static void createFile(String templateName,String docFileName, Map<String,Object> rootMap,HttpServletRequest request, HttpServletResponse response,int fileType) throws IOException { // response.resetBuffer(); //設置導出 response.addHeader("Cache-Control","no-cache"); response.setCharacterEncoding("UTF-8"); if( WORD_FILE == fileType){ response.setContentType("application/vnd.ms-word;charset=UTF-8"); }else if(EXCEL_FILE == fileType){ response.setContentType("application/octet-stream;charset=UTF-8"); }else{ response.setContentType("application/octet-stream"); } String ua = request.getHeader("user-agent"); ua = ua == null ? null : ua.toLowerCase(); if(ua != null && (ua.indexOf("firefox") > 0 || ua.indexOf("safari")>0)){ try { docFileName = new String(docFileName.getBytes(),"ISO8859-1"); response.addHeader("Content-Disposition","attachment;filename=" + docFileName); } catch (Exception e) { } }else{ try { docFileName = URLEncoder.encode(docFileName, "utf-8"); response.addHeader("Content-Disposition","attachment;filename=" + docFileName); } catch (Exception e) { } } check(request); //解析模版 Template temp = cfg.getTemplate(templateName, "UTF-8"); PrintWriter write = response.getWriter(); try { temp.process(rootMap, write); } catch (TemplateException e) { e.printStackTrace(); }finally { if(write != null){ write.flush(); write.close(); } } } }
2.4、ftl 模板
https://files.cnblogs.com/files/niceyoo/ftl2doc.rar
至於,ftl 如何生成,以及如何寫,可自定查詢,后面也會單獨文章補充。
博客地址:http://www.cnblogs.com/niceyoo
18年專科畢業后,期間一度迷茫,最近我創建了一個公眾號用來記錄自己的成長。