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

摘要:
ftl语法呢?2.3.工具类FreemarkUtilpublicclassFreemarkUtil{privatestaticfinalObjectLOCK=newObject();/**word file*/publicstaticfinalWORD_file=1;/**excel file*/publicstaticfinalEXCEL_file=2;privatestaticConfigurationcfg;privatestaticFreemarkUtilthrowsIOException{cfg=newConfiguration();cfg.setDirectoryForTemplateLoading;cfg.g.setObjectWrapper;}privatestaticvoidcheck{if{synchronized{try{ftl=newFreemarkerUtil;}捕获{e.printStackTrace();}}}}/***要创建word文档,必须首先设置响应导出配置,然后解析模板。否则,将出现问题*@sthrowsIOException*/publicstaticvoidcreateFilethrowsIOException{//response.resetBuffer();//设置导出response.addHeader;response.setCharacterEncoding;if{response.setContentType;}elseif{response.setContentType;}否则{response.setContentType;}Stringua=请求。getHeader;ua=ua==空?

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 语法了解一下?

8、jeecg 笔记之 自定义word 模板导出(一)第1张

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 如何生成,以及如何写,可自定查询,后面也会单独文章补充。

8、jeecg 笔记之 自定义word 模板导出(一)第2张

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

 18年专科毕业后,期间一度迷茫,最近我创建了一个公众号用来记录自己的成长。 

8、jeecg 笔记之 自定义word 模板导出(一)第3张

免责声明:文章转载自《8、jeecg 笔记之 自定义word 模板导出(一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇图片去重ovs offload下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

springboot之配置文件

springboot在加载配置文件的时候是有先后顺序的,了解加载配置文件的先后顺序,可以减少编写程序出现错误 1 springboot加载配置文件的先后顺序如下: SpringApplication将从以下位置加载application.properties文件,并把它们添加到Spring Environment中: 当前目录下的/config子目录。...

手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理

摘自:https://www.cnblogs.com/goodAndyxublog/p/11880314.html 手把手教你实现热更新功能,带你了解 Arthas 热更新背后的原理 文章来源:https://studyidea.cn/java-hotswap 一、前言# 一天下午正在摸鱼的时候,测试小姐姐走了过来求助,说是需要改动测试环境 mock...

Asp.net中基于Forms验证的角色验证授权

Asp.net的身份验证有有三种,分别是"Windows | Forms | Passport",其中又以Forms验证用的最多,也最灵活。Forms 验证方式对基于用户的验证授权提供了很好的支持,可以通过一个登录页面验证用户的身份,将此用户的身份发回到客户端的Cookie,之后此用户再访问这个web应用就会连同这个身份Cookie一起发送到服务端。服务...

细说 Form (表单)

细说 Form (表单) 阅读目录 开始 简单的表单,简单的处理方式 表单提交,成功控件 多提交按钮的表单 上传文件的表单 MVC Controller中多个自定义类型的传入参数 F5刷新问题并不是WebForms的错 以Ajax方式提交整个表单 以Ajax方式提交部分表单 使用JQuery,就不要再拼URL了! id, name 有什么关系 使用C#...

WebSocket原理及与http1.0/1.1 long poll跟 ajax轮询的区别【转自知乎】

今天学习了几个以前没有见过的东东,作者的文章写的还是很通熟易懂的!! 起码我基本都看懂了(2333)————正文 今天要学习的是WebSocket原理与http1.0/1.1 long poll 和 ajax轮询的区别 WebSocket是HTML5出的东西,也就是说HTTP谢意没有变化,或者说没有关系。首先HTTP有1.1和1.0直说,也就是所谓的kee...

pm grant 命令

CustomLocale.apk所需要的权限"android.permission.CHANGE_CONFIGURATION"自Android 4.2,4.2.2起系统定义为android:protectionLevel="signature|system|development",这就需要在已root的android设置上运行命令: adb shell...