jeecg 笔记之 自定义word 模板导出(一)

1、前言

jeecg 中已经自带 word 的导出导出功能,其所使用的也是 easypoi,尽管所导出的 word 能满足大部分需求,

但总是有需要用到自定义 word导出模板,下文所用到的皆是 easypoi 提供的,为方便下次翻阅,故记之。

 

2、代码部分

2.1、controller

jeecg 笔记之 自定义word 模板导出(一)
@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();
    }
}
jeecg 笔记之 自定义word 模板导出(一)

 

2.2、entity

实体就不扔出来了,详细说一下这个地方:

jeecg 笔记之 自定义word 模板导出(一)
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);
jeecg 笔记之 自定义word 模板导出(一)

jeecgDemoExcel  为 List<实体>,departs 为 List<Map<String, Object>>,怎么用?ftl 语法了解一下?

jeecg 笔记之 自定义word 模板导出(一)

2.3、工具类 FreemarkerUtil 

jeecg 笔记之 自定义word 模板导出(一)
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();
                }
            }
        }
}
jeecg 笔记之 自定义word 模板导出(一)

 

2.4、ftl 模板

https://files.cnblogs.com/files/niceyoo/ftl2doc.rar

至于,ftl 如何生成,以及如何写,可自定查询,后面也会单独文章补充。

jeecg 笔记之 自定义word 模板导出(一)

 

 博客地址:http://www.cnblogs.com/niceyoo

 

上一篇:新建module模块,生成代码


下一篇:JEECG开发第一个菜单显示设备列表