利用Ext grid显示前台数据,然后把前台数据进行Excel表导出

 

http://blog.csdn.net/yixiaotian1988/article/details/6275256

近期在做一个项目,项目的要求是:

利用Ext grid显示前台数据,然后把前台数据进行Excel表导出,再导出报表的时候要求:

1、要把grid数据显示的表头信息导入Excel表

2、在导出Excle表的时候,可以进行选择,是进行勾选的导出,还是批量导出(勾选导出,根据勾选的记录导出,批量导出,全部导出),

3、在进行批量导出的时候,是分页显示还是显示成一页(sheet标签,在Excel表中用)

首先,我们先准备数据,创建grid并把数据填充进去,这里我就不再多说,不是本文的重点:

但需要说明的是,在进行store准备数据的时候,我们要保证命名的规范性,为接下来的利用java反射取得数据打下基础,

 

 

接下来根据要求,我们设计一个按钮,当点击按钮的时候,弹出一个窗口,即上图中的图片,为我们提供选择

还有就是要得到grid数据的表头信息

关键代码:strBuffer为我们自己重写的StringBuffer类

 for(var j=2; j<columns.getColumnCount(); j++){    
              strBuffer1.append(columns.getColumnHeader(j));   /*得到所有列头信息并放入StringBuffer中*/
              strBuffer1.append(",");       /*添加分隔符*/
  }

那为什么我们要在每一个字段之后加上一个“,”号呢?这里我们把数据传递到后台做准备的,这样我们就只需要把一个字符串传递到后台中,然后再在后台中利用java的split方法把数据再提取出来

得到勾选的数据的编号,即数据在数据库的id号,我们也是利用字符串向后台进行传递:

for(var k=2; k<columns.getColumnCount(); k++){    
                                  strBuffer2.append(columns.getDataIndex(k));   /*得到所有列头信息并放入StringBuffer中*/
                                  strBuffer2.append(",");       /*添加分隔符*/
 }

 

 

已经把前台的各项数据都已经得到,那么就需要向后台来传递啦!!

这里我们是做出了一个Ext的一个简单的弹出窗口来实现的,如第一个图中,

这里我们是利用Ext.form的submit()方式进行的提交,在这里一定要注意是submit()方式,而不能是Ajax,这与我们后面的弹出导出Excel的窗口是紧密相连的,关键代码:

  var f = new Ext.FormPanel({
              frame:true,
              layout:"form",
              buttonAlign:'center',
              onSubmit: Ext.emptyFn,
              submit: function() {
                      this.getEl().dom.action= url;
                      this.getEl().dom.method = 'post',
                      this.getEl().dom.submit(),
                      win.close()
              },

           …………

 

   var btnSubmit = new Ext.Button({
               text: "提交",
               handler: function(){
                        f.getForm().submit();
               }
    });   

 

以这种方式提交,并不是真正的Ajax,而是类似于普通Html的表单提交方式,

看后台代码如何来解析从前台获得的数据:


        String empStr = request.getParameter("headers");   //拆分字符串得到表头信息
        if(!"".equals(empStr) && null!= empStr){
            String str1 = empStr.substring(0, empStr.length()-1);
            headers = str1.split(",");
        }

 

这样就把前台的数据传递到后台,然后就是进行流的输入输出,生成Excel:关键代码如下

WritableWorkbook wwb = Workbook.createWorkbook(os);

for (int j = 0; j < title.length; j++) {// 开始写入第一行(即标题栏)
            Label label = null;       // 用于写入文本内容到工作表中去
            label = new Label(j, 0, title[j]);  // 在Label对象的构造中指明单元格位置(参数依次代表列数、行数、内容 )
            sheet.setColumnView(j, 30);   // 将定义好的单元格添加到工作表中
            sheet.addCell(label);
        }
       
        for (int row = 0; row < empList.size(); row++) {  // 开始写入内容
            List list = (List) empList.get(row);   // 获取一条(一行)记录
            for (int col = 0; col < list.size(); col++) {  // 数据是文本时(用label写入到工作表中)
                String listvalue = (String) list.get(col).toString();
                Label label = null;
                label = new Label(col, row + 1, listvalue);
                sheet.addCell(label);
            }
        }

 

然后就是弹出窗口,提示用户进行“打开”或者是“保存”啦!!

        OutputStream out = null;
        InputStream in = null;
        // 获得文件名
        String filename = URLEncoder.encode(file.getName(), "UTF-8");
        // 定义输出类型(下载)
        response.setContentType("application/force-download");
        response.setHeader("Location", filename);

        // 定义输出文件头
        response.setHeader("Content-Disposition", "attachment;filename="
                + filename);
        out = response.getOutputStream();
        in = new FileInputStream(file.getPath());

        byte[] buffer = new byte[1024];
        int i = -1;
        while ((i = in.read(buffer)) != -1) {
            out.write(buffer, 0, i);
        }

        in.close();
        out.flush();
        out.close();
       
        if (isDel) {
            // 删除文件,删除前关闭所有的Stream.
            file.delete();
        }

 

然后就会弹出窗口:

 

至此,我们的工作基本完成!!!

部分关键代码已经在我的资源里,可以进行下载!!!

你可能感兴趣的:(职场,Excel,ExtJs,休闲,4)