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

 18年專科畢業后,期間一度迷茫,最近我創建了一個公眾號用來記錄自己的成長。 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM