easyui 插件datagrid扩展应用:动态拼接二维列,表格底部合计行,前端分页,前端生成报表,使用小结:

 

 

 

 动态拼接成二维列表头。。。

小结:根据后台传出数据,拼接需要的二维列数组,关键是重新设置columns:属性

  function zhihang() {
            var rowArr1 = [], rowArr2 = [], cols = [], flag = false;
            $('#dg_zhihang').datagrid({
                loadFilter: pagerFilter,
                url: "/Service/Customer.ashx?Method=List_guanxia_calendar_network&type=2&" + $("#form1").serialize(), //请求路径
                method: 'get',
                singleSelect: true, //选中一行的设置
                rownumbers: true, //行号
                sortName: 'NetworkNO',
                sortOrder: 'desc',
                //remoteSort: false,
                remoteSort: false,
                showFooter: true,
                height: $(window).height() - 238,
                pageSize: 18,
                pageList: [5, 10, 18, 25, 30],
                onLoadSuccess: function (data) {
                    if (!flag) {
                        var yearNo = $("#TextBox2").val().substr(0, 4);
                        for (var prop in data.rows[0]) {// 
                            if (data.rows[0][prop] != null && /^[0-9]+$/.test(prop.substr(0, 1))) {
                                rowArr1.push({
                                    field: prop, title: prop, width: 70, halign: 'center', align: 'right', sortable: true, order: "desc", formatter: function (value) { return value==null?"":value + '万';}
                                });
                                //console.log(yearNo + "-" + prop);
                                rowArr2.push({ field: prop, title: getWeek(yearNo + "-" + prop), width: 70, halign: 'center', align: 'right', sortable: true, order: "desc", formatter: function (value) { return value == null ? "" : value + '万'; } });
                            }
                        }
                        // }
                        cols.push(rowArr1);
                        cols.push(rowArr2);
                        $('#dg_zhihang').datagrid({
                            columns: cols
                        });
                        flag = true;
                        //console.log(data);
                    }       
                   
                    tempData = data.originalRows;
                    $("#dg_zhihang").datagrid('statistics',tempData);
                },
                frozenColumns: [[
                { field: "Name", title: "支行名称", width: 130, halign: 'center', sortable: true, order: "desc" },
                { field: "NetworkNO", title: "支行号", width: 70, align: 'center', sortable: true, order: "desc" },
                ]],
                columns: cols,
                pagination: true
            });


            $("#dg_zhihang").datagrid('getPager').pagination({
                beforePageText: "第",
                afterPageText: "页 共{pages}页",
                displayMsg: "当前 {from} - {to}条数据   共{total} 条数据",
                pageSize: 18,
                pageList: [5, 10, 18, 25, 30]
            });
        }

 function getWeek(dateString) {
            var arys1 = new Array();
            arys1 = dateString.split('-');     //日期为输入日期,格式为 2013-3-10
            var ssdate = new Date(arys1[0], parseInt(arys1[1] - 1), arys1[2]);
            var week1 = String(ssdate.getDay()).replace("0", "日").replace("1", "一").replace("2", "二").replace("3", "三").replace("4", "四").replace("5", "五").replace("6", "六");//就是你要的星期几
            var week = "星期" + week1;
            return week;
        };

function report() {
    if (tempData.length == undefined)
        top.$.messager.info('提示', '暂时没有数据可导出');
    else {
        JSonToCSV.setDataConver({
            data: tempData,
            fileName: '销售数据报表',
        });
    }
}

二维列表格底部加合计

小结:需要注意的是,二维列的时候,是statistics:方法,一维列的时候,statistics方法

需要显示:showFooter:true

//$(function () {
$.extend($.fn.datagrid.methods,
       {
           statistics: function (jq,data) {
               //console.log(jq);
               if(data==null ||data.length==0 ){

                   return;
               }

               //console.log(jq );
               //console.log(typeof(jq.length));
               //console.log(data);
               //alert(arguments.length);

               var opt = $(jq).datagrid('options').columns;
               var frzOpt = $(jq).datagrid("options").frozenColumns;
               var rows = $(jq).datagrid("getRows");
               if (data instanceof Array) {
                   var rows = data;
               }
               else {

                   var rows = $(jq).datagrid("getRows");
               }
               //console.log(opt);
               //console.log(frzOpt);
               //debugger;
               var footer = new Array();
               footer['sum'] = "";
               //设置为opt[1]也就是第二列,主要是二维表头处理
               for (var i = 0; i < opt[1].length; i++) {
                   //if (opt[1][i].sum) {
                   //    footer['sum'] = footer['sum'] + sum(opt[1][i].field, 1) + ',';
                   //}
                   if (opt[1][i].field) {
                       //console.log(opt[1][i].field);
                       footer['sum'] = footer['sum'] + sum(opt[1][i].field) + ',';
                       //这里已经将需要的json拼接完成
                   }
               }
               //---------
               for (var i = 0; i < opt[0].length; i++) {
                   //if (opt[1][i].sum) {
                   //    footer['sum'] = footer['sum'] + sum(opt[1][i].field, 1) + ',';
                   //}
                   if (opt[0][i].field) {
                       //console.log(opt[0][i].field);
                       footer['sum'] = footer['sum'] + sum(opt[0][i].field) + ',';
                       //这里已经将需要的json拼接完成
                   }
               }
               //console.log(footer['sum']);
               var footerObj = new Array();
               if (footer['sum'] != "") {
                   var tmp = '{' + footer['sum'].substring(0, footer['sum'].length - 1) + "}";
                   //console.log(tmp);
                   var obj = eval('(' + tmp + ')');
                   if (frzOpt[0][0].field != undefined) {
                       //将合计放在名称一类,第一列opt[0][0].field
                       //&#x5408;&#x8BA1;unicode转码,不清楚放在另外一个文件夹,又没事儿
                       footer['sum'] += '"' + frzOpt[0][0].field + '":"<b>\u5408\u8ba1:</b>"';
                      

                       //第0列显示为合计
                       obj = eval('({' + footer['sum'] + '})');
                   }
                   else {
                       obj[opt[0][1].field] = "<b>\u5408\u8ba1:</b>" + obj[opt[0][1].field];
                   }
                   //obj.frzOpt[0][0].field = "合计:";
                   footerObj.push(obj);
               }
               
               if (footerObj.length > 0) {
                   //footerObj[0].shouyilv = (footerObj[0].shouyi / footerObj[0].Benjin) * 100;
                   //footerObj[0]
                   $(jq).datagrid('reloadFooter', footerObj);
                   // $(jq).datagrid('reloadFooter');
                   //$(jq).datagrid('reload');
                   return footerObj;
                   //$(jq).datagrid('insertRow', footerObj[0]);
                   //使用getData方法获取grid的数据data,然后将ajax请求的数据push到data中,最后在进行loadData
                   //最后一列,不是直接求和,而是收益除以本金
               }
               function sum(filed) {
                   var sumNum = 0;
                   var str = "";
                   for (var i = 0; i < rows.length; i++) {
                       var num = rows[i][filed];
                       sumNum += Number(num);
                   }
                   //console.log(filed.substr(filed.length - 2, 2));
                   if (filed.substr(filed.length - 2, 2) == '排名' || typeof (rows[0][filed]) != 'number' || filed == "年龄"||filed.substr(filed.length - 2, 2) == '简称') {
                       //console.log(sumNum.toFixed(2));
                       //return '"' + filed + '":' + sumNum + '';
                       
                   }
                   else {
                       return '"' + filed + '":' + sumNum.toFixed(2) + '';
                   }
               }
           }
       });
//});

$.extend($.fn.datagrid.methods,
        {
            statistics_: function (jq, data) {
                if(data==null ||data.length==0 )
                {
                    
                    return;
                }
                //console.log(jq );
                //console.log(typeof(jq.length));
                //console.log(data);
                //alert(arguments.length);
                var opt = $(jq).datagrid('options').columns;
                //console.log(opt);
                var frzOpt = $(jq).datagrid("options").frozenColumns;
                if (data instanceof Array) {
                    var rows = data;
                }
                else {
                    
                    var rows = $(jq).datagrid("getRows");
                }
                

                var footer = new Array();
                footer['sum'] = "";
                //设置为opt[1]也就是第二列,主要是二维表头处理

                //-------------------------------非二维列,只要【0】而不是【1】
                for (var i = 0; i < opt[0].length; i++) {
                    //if (opt[1][i].sum) {
                    //    footer['sum'] = footer['sum'] + sum(opt[1][i].field, 1) + ',';
                    //}
                    if (opt[0][i].field) {
                        footer['sum'] = footer['sum'] + sum(opt[0][i].field) + ',';
                        //这里已经将需要的json拼接完成
                    }
                }
                //console.log(footer['sum']);
                var footerObj = new Array();
                if (footer['sum'] != "") {
                    var tmp = '{' + footer['sum'].substring(0, footer['sum'].length - 1) + "}";
                    var obj = eval('(' + tmp + ')');
                    if (obj[frzOpt[0][0].field] == undefined) {
                        //将合计放在名称一类,第一列opt[0][0].field
                        footer['sum'] += '"' + frzOpt[0][0].field + '":"<b>\u5408\u8ba1:</b>"';

                        //第0列显示为合计
                        obj = eval('({' + footer['sum'] + '})');
                    }
                    else {
                        obj[opt[0][0].field] = "<b>\u5408\u8ba1:</b>" + obj[opt[0][0].field];
                    }
                    footerObj.push(obj);
                }
                //console.log(footerObj);
                if (footerObj.length > 0) {
                    //footerObj[0].shouyilv = (footerObj[0].shouyi / footerObj[0].Benjin) * 100;
                    $(jq).datagrid('reloadFooter', footerObj);
                    //$(jq).datagrid('reload');

                    return footerObj;
                    //$(jq).datagrid('insertRow', footerObj[0]);
                    //使用getData方法获取grid的数据data,然后将ajax请求的数据push到data中,最后在进行loadData
                    //最后一列,不是直接求和,而是收益除以本金
                }

                function sum(filed) {
                    var sumNum = 0;
                    var str = "";
                    for (var i = 0; i < rows.length; i++) {
                        var num = rows[i][filed];
                        sumNum += Number(num);
                    }

                    //console.log(filed.indexOf("排名") + filed);
                    if (filed.substr(filed.length - 2, 2) == '排名' ||typeof(rows[0][filed])!='number' || filed=="年龄") {
                        //console.log(sumNum.toFixed(2));
                        //return '"' + filed + '":' + sumNum + '';

                    }
                    else {
                        return '"' + filed + '":' + sumNum.toFixed(2) + '';
                    }
                    //去掉双引号,这是一个数字                     

                }
            }
        });

 

前端分页

function pagerFilter(data) {
    if (typeof data.length == 'number' && typeof data.splice == 'function') {    // 判断数据是否是数组
        data = {
            total: data.length,
            rows: data
        }
    }
    var dg = $(this);
    var opts = dg.datagrid('options');
    var pager = dg.datagrid('getPager');
    pager.pagination({
        onSelectPage: function (pageNum, pageSize) {
            opts.pageNumber = pageNum;
            opts.pageSize = pageSize;
            pager.pagination('refresh', {
                pageNumber: pageNum,
                pageSize: pageSize
            });
            dg.datagrid('loadData', data);
        }
    });
    if (!data.originalRows) {
        data.originalRows = (data.rows);
    }
    var start = (opts.pageNumber - 1) * parseInt(opts.pageSize);
    var end = start + parseInt(opts.pageSize);
    
    data.rows = (data.originalRows.slice(start, end));
    return data;
}

前端生成报表 

小结:浏览器兼容性,和表格样式可调整性偏低,建议还是后台借助微软第三方插件

function JSONToCSVConvertor(JSONData, ReportTitle, ShowLabel) {
    //If JSONData is not an object then JSON.parse will parse the JSON string in an Object
    var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData;

    var CSV = '';
    //Set Report title in first row or line

    //CSV += ReportTitle + '\r\n\n';

    //This condition will generate the Label/Header
    if (ShowLabel) {
        var row = "";

        //This loop will extract the label from 1st index of on array
        for (var index in arrData[0]) {

            //Now convert each value to string and comma-seprated
            row += index + ',';
        }

        row = row.slice(0, -1);

        //append Label row with line break
        CSV += row + escape('\r\n');
    }

    //1st loop is to extract each row
    for (var i = 0; i < arrData.length; i++) {
        var row = "";

        //2nd loop will extract each column and convert it in string comma-seprated
        for (var index in arrData[i]) {
            row += '"' + arrData[i][index] + '",';
        }

        row.slice(0, row.length - 1);

        //add a line break after each row
        CSV += row + escape('\r\n');
        //CSV += row + encodeURIComponent('\r\n');
    }

    if (CSV == '') {
        alert("Invalid data");
        return;
    }

    //Generate a file name
    var fileName = "";
    //this will remove the blank-spaces from the title and replace it with an underscore
    fileName += ReportTitle.replace(/ /g, "_");

    //Initialize file format you want csv or xls
    var uri = 'data:text/xls;charset=utf-8,\ufeff' + CSV;

    // Now the little tricky part.
    // you can use either>> window.open(uri);
    // but this will not work in some browsers
    // or you will not get the correct file extension    
    
    //this trick will generate a temp <a /> tag
    //--------------------------------------------------
    
    //IE只能使用Blob文件下载,不支持URI,详见:
    //https://technet.microsoft.com/ZH-CN/Library/hh779016.aspx
    var ua = navigator.userAgent.toLowerCase();
    
    if ((ua.indexOf("rv:11.0") != -1) || (ua.indexOf("msie") != -1)) {
        //var data = "\ufeff" + CSV;
        // var blob = new Blob([data], { type: 'text/csv,charset=UTF-8' });
        //var blob = new Blob([decodeURIComponent(encodeURI(CSV))], {
        //    type: "text/csv;charset=utf-8;"
        //});
        // alert(true);
       
        var blob = new Blob([decodeURIComponent("\ufeff" + CSV)], {
            type: "text/csv;charset=utf-8;"
        });
        window.navigator.msSaveBlob(blob, fileName + ".xls");
        /*
        var link = document.createElement("a");
        link.href = uri;

        //set the visibility hidden so it will not effect on your web-layout
        link.style.visibility = "hidden";
        link.download = fileName + ".xls";

        //this part will append the anchor tag and remove it after automatic click
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);*/
        
    }
    else {
        //var link = document.createElement("a");
        //link.href = encodeURI(CSV);
        //link.style = "visibility:hidden";
        //link.download = fileName + ".csv";
        //document.body.appendChild(link);
        //link.click();
        //document.body.removeChild(link);
        
        var link = document.createElement("a");
        link.href = uri;

        //set the visibility hidden so it will not effect on your web-layout
        link.style.visibility = "hidden";
        link.download = fileName + ".xls";

        //this part will append the anchor tag and remove it after automatic click
        document.body.appendChild(link);
        link.click();
        document.body.removeChild(link);
        
        
    }
    
    //------------------------------------------------------
    
}



var JSonToCSV = {
    /*
     * obj是一个对象,其中包含有:
     * ## data 是导出的具体数据
     * ## fileName 是导出时保存的文件名称 是string格式
     * ## showLabel 表示是否显示表头 默认显示 是布尔格式
     * ## columns 是表头对象,且title和key必须一一对应,包含有
          title:[], // 表头展示的文字
          key:[], // 获取数据的Key
          formatter: function() // 自定义设置当前数据的 传入(key, value)
     */
    setDataConver: function (obj) {
        var bw = this.browser();
        if (bw['ie'] < 9) return; // IE9以下的
        var data = obj['data'],
            ShowLabel = typeof obj['showLabel'] === 'undefined' ? true : obj['showLabel'],
            fileName = (obj['fileName'] || 'UserExport') + '.csv',
            columns = obj['columns'] || {
                title: [],
                key: [],
                formatter: undefined
            };
        var ShowLabel = typeof ShowLabel === 'undefined' ? true : ShowLabel;
        var row = "", CSV = '', key;
        // 如果要现实表头文字
        if (ShowLabel) {
            // 如果有传入自定义的表头文字
            if (columns.title.length) {
                columns.title.map(function (n) {
                    row += n + ',';
                });
            } else {
                // 如果没有,就直接取数据第一条的对象的属性
                for (key in data[0]) row += key + ',';
            }
            row = row.slice(0, -1); // 删除最后一个,号,即a,b, => a,b
            CSV += row + '\r\n'; // 添加换行符号
        }
        // 具体的数据处理
        data.map(function (n) {
            row = '';
            // 如果存在自定义key值
            if (columns.key.length) {
                columns.key.map(function (m) {
                    row += '"' + (typeof columns.formatter === 'function' ? columns.formatter(m, n[m]) || n[m] : n[m]) + '",';
                });
            } else {
                for (key in n) {
                    row += '"' + (typeof columns.formatter === 'function' ? columns.formatter(key, n[key]) || n[key] : n[key]) + '",';
                }
            }
            row.slice(0, row.length - 1); // 删除最后一个,
            CSV += row + '\r\n'; // 添加换行符号
        });
        if (!CSV) return;
        this.SaveAs(fileName, CSV);
    },
    SaveAs: function (fileName, csvData) {
        var bw = this.browser();
        if (!bw['edge'] || !bw['ie']) {
            var alink = document.createElement("a");
            alink.id = "linkDwnldLink";
            alink.href = this.getDownloadUrl(csvData);
            document.body.appendChild(alink);
            var linkDom = document.getElementById('linkDwnldLink');
            linkDom.setAttribute('download', fileName);
            linkDom.click();
            document.body.removeChild(linkDom);
        }
        else if (bw['ie'] >= 10 || bw['edge'] == 'edge') {
            var _utf = "\uFEFF";
            var _csvData = new Blob([_utf + csvData], {
                type: 'text/csv'
            });
            navigator.msSaveBlob(_csvData, fileName);
        }
        else {
            var oWin = window.top.open("about:blank", "_blank");
            oWin.document.write('sep=,\r\n' + csvData);
            oWin.document.close();
            oWin.document.execCommand('SaveAs', true, fileName);
            oWin.close();
        }
    },
    getDownloadUrl: function (csvData) {               
        var _utf = "\uFEFF"; // 为了使Excel以utf-8的编码模式,同时也是解决中文乱码的问题
        if (window.Blob && window.URL && window.URL.createObjectURL) {           
                       var csvData = new Blob([_utf + csvData], {
                        type: 'text/csv'
                  });                
        }
        return URL.createObjectURL(csvData);
    },
    browser: function () {
        var Sys = {};
        var ua = navigator.userAgent.toLowerCase();
        var s;
        (s = ua.indexOf('edge') !== -1 ? Sys.edge = 'edge' : ua.match(/rv:([\d.]+)\) like gecko/)) ? Sys.ie = s[1] :
            (s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
            (s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
            (s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
            (s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
            (s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
        return Sys;
    }
};

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值