1. 程式人生 > >8、jeecg 筆記之 自定義word 模板匯出(一)

8、jeecg 筆記之 自定義word 模板匯出(一)

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