I hava a coding dream

Kendoui之grid保存为Excel

2017-03-24  本文已影响2522人  查无此人_chazz

Kendoui中的Grid组件是一个强大的报表生成组件,可以通过读取dataSource._data来快速生成一个便于浏览的报表,并提供一系列对报表的操作;
API:http://www.kendoui.io/kendo-ui/api/javascript/ui/grid.html


在制作报表时常会遇到的需求是报表的导出。将报表导出为一个Excel格式更便于浏览、维护及打印。同时Grid也提供了此功能

    var grid = $("#grid").data("kendoGrid");
    grid.saveAsExcel();

只需要这样两行简单的代码就能将grid中的数据导出
** 但是... **
有时候导出的数据和我们想象的不太一样!!!

<script src="http://cdnjs.cloudflare.com/ajax/libs/jszip/2.4.0/jszip.js"></script>
excelExport: function(e) {
                e.workbook.fileName = "xxx.xlsx";
            }

方法2:

excel: {
        fileName: "xxx.xlsx"
    },
//在每次调用saveAsGrid前会先执行这里面的函数
excelExport: function(e) {
    console.log(e.data);//打印e.data发现这里面的数据就是最后在Excel中输出的值
    /*
     *  处理e.data即可
     *  将对数据的处理逻辑放在这里!!!!!!!!!!!!!
     */
            }

方法2:

//在调用saveAsExcel()前对grid._data进行处理
 var grid = $("#grid").data("kendoGrid");
console.log(grid._data);//打印grid._data发现这里面的数据就是打印出来的数据;
/*
 *因为grid中显示的数据也是grid._data,所以直接修改grid._data会导致显示的数据也发生变化
 *所以需要先将grid复制一份
 */
var excel={};
$.extend(excel,grid);//此时excel就是grid的副本,拥有和grid一样的属性和函数,对grid的操作可以转移到excel上来进行
$.each(excel._data,function (i,item) {//逐行处理数据
  //将对数据的处理逻辑放在这里!!!!!!!!!!!!!
})
 excel.saveAsExcel();
excel:{
    allPages:true//是否导出所有页中的数据
},

以上。


分割线:
一、关于导出grid中行是收缩到一起的问题:由于grid-columns-field在定义宽度的时候存在两种方式:
1.页面自适应形式:width定义为百分数
2.固定长度形式:width定义为数字
使用第一中方法导出Excel时,Excel不能获得具体的宽度,所以默认无宽度,造成的直接结果就是导出的列全部收缩在一起。使用第二种方法导出Excel时,在field中定义的width就是导出的Excel的列的宽度。使用第二种长度定义形式能解决列收缩的问题;
二、关于导出中grid需要导出部分列的解决办法:
1.经过测试grid.saveAsExcel()导出的Excel只包含当前grid显示的列,隐藏的列不会被导出。
2.测试grid的Event中的excelExport事件是发生在saveAsExcel之后
所以可以通过两步可以解决控制grid只导出部分列的问题:

  • 在执行grid.saveAsExcel()执行的前一步,将那些不需要导出到Excel的列使用grid.hideColumn()隐藏起来
  • 给grid定义excelExport事件,这个事件主要处理的是将那些刚刚被隐藏起来的列使用grid.showColumn()显示出来

浏览器支持情况

kendo官方文档并没有直接给出关于导出Excel功能对浏览器的支持情况,但是为了保险起见,请尽量使用IE10+以及Firefox4+以及其他现代浏览器

上一篇 下一篇

猜你喜欢

热点阅读