excel 前端下载插件https://github.com/wangerzi/layui-excel

  插件 github 下载地址  

   https://github.com/wangerzi/layui-excel

    <script src="js/jquery-1.11.1.min.js"></script>    
    <script src="js/excel.js"></script>

  jqgrid excel 下载方法封装,支持复杂表头

(设置jqgrid行合并,下面方法用的到)

 setRowMerger:function(opts){
        var def = {
            gridId:'jqGrid',   //grid 的id
            isMerge:true,  // 是否做表格合并,true时即做技术又做合并,false时只做计算
            data:[
                // {name: 'k',gist:['k','k'],num:1},
                // name: 列名称
                // gist: 行合并依据列名称集合
                // num: 行合并数
            ]
        }

        $.extend(def,opts);

        var $grid = $('#'+ def.gridId);
        var mya = $grid.getDataIDs();
        var length = mya.length;


        function flagFn(start,end,arr){
            var flag = true
            $.each(arr,function(k,v){
                if(start[v] != end[v]){
                    flag = false
                }
            })
            return flag
        }

        var cellObj = {}
        var deleteObj = {}

        $.each(def.data, function(k,v){
            var num = v.num;
            var CellName = v.name;
            cellObj[CellName] = {};
            deleteObj[CellName] = {};
            if(!num){
                for (var i = 0; i < length; i++) {
                    var before = $grid.jqGrid('getRowData', mya[i]);//从上到下获取一条信息
                    var rowSpanTaxCount = 1;//定义合并行数
                    for (var j = i + 1; j <= length; j++) {
                        //和上边的信息对比 如果值一样就合并行数+1 然后设置rowspan 让当前单元格隐藏
                        var end = $grid.jqGrid('getRowData', mya[j]);

                        if (flagFn(before,end,v.gist)) {
                            rowSpanTaxCount++;
                            if(def.isMerge){$grid.setCell(mya[j], CellName, '', { display: 'none' });}
                        } else {
                            rowSpanTaxCount = 1;
                            break;
                        }

                        if(def.isMerge){ $("#" + v.name + "" + mya[i] + "").attr("rowspan", rowSpanTaxCount); }
                        cellObj[CellName][v.name + "" + mya[i]] = [i+1, rowSpanTaxCount];
                        deleteObj[CellName][v.name + "" + mya[j]] = [j+1, rowSpanTaxCount];

                    }

                }
            }else{
                for (var i = 0; i < length; i++) {
                    for (j = i + 1; j <= length; j++) {
                        if(j%num != 0){
                            if(def.isMerge){ $grid.setCell(mya[j], CellName, '', { display: 'none' });}
                        }
                        if(def.isMerge){ $("#" + v.name + "" + mya[i] + "").attr("rowspan", num);}
                        cellObj[CellName][v.name + "" + mya[i]] = [i+1, num];
                        deleteObj[CellName][v.name + "" + mya[j]] = [j+1, num];
                    }
                }
            }
        })

        $.each(cellObj,function(k,v){
            $.each(deleteObj[k],function(dk,dv){
                if(v[dk]){
                    delete v[dk]
                }
            })
        })

        return cellObj
    },

jqgrid excel 导出方法

    exportExcel: function(opts){
        var defauls = {
            fileType:'xlsx',//文件类型 支持 xlsx、csv、ods、xlsb、fods、biff2
            fileName:'导出excel数据', //文件名称
            gridId:'',  //需要下载的jgrid表id
            exclude:[], //过滤非下载列name
            groupHeaders:null,  // 表头合并参数(freeGrid版本下使用)
            rowMerger:{}, //行合并数据集合
            showHead:true, // 显示表头
            showData:true, // 显示表身数据
            total:{
                show:false, //是否开启合计行
                position:'',//合计名称所在列位置
                label:'合计',//名称
                data:[]      //需要合计的列 name
            },
            download:{
                data:[],   //json数据  不通过jqgrid 直接下载 同时支持合计和过滤
                head:[]   //表头 直接下载表头
            }
        }

        $.extend(true,defauls,opts);

        var config ={
            KEY:{},
            mergeConf:[],
            data:[],
            head:[],
            _head:[],
            _groupHeader:[],
            _colConf:{},
            headLength:0,
            // 行合并
            setRowMerger:function(){
                var _heardNum = config._groupHeader &&  config._groupHeader.length ?  config._groupHeader.length : 1
                var cellMergeArr = []
                var _rowMerger = defauls.rowMerger;
                if(_rowMerger){
                    var _rowMergerData = setRowMerger(_rowMerger);

                    $.each(config._head,function(k,v){
                        $.each(_rowMergerData,function(rk,rv){
                            if(v.name == rk ){
                                $.each(rv,function(jk,jv){
                                    cellMergeArr.push([
                                        LAY_EXCEL.numToTitle(k + 1) + (jv[0] + _heardNum),
                                        LAY_EXCEL.numToTitle(k + 1) + (jv[0] + _heardNum + jv[1] - 1)
                                    ])
                                })
                            }
                        })
                    })
                    config.mergeConf= config.mergeConf.concat(cellMergeArr)
                }
            },
            gridDown:function(){
                var GridParam = $("#"+defauls.gridId).jqGrid('getGridParam')
                var data = GridParam.data;
                var head = GridParam.colModel;
                var groupHeader = defauls.groupHeaders ? defauls.groupHeaders : GridParam.groupHeader;
                config._groupHeader = groupHeader || [];
                var _head = {}
                var _data = [];
                var exclude = defauls.exclude.concat(['rn','cb']);

                // 动态过滤显示的列  exclude 里的
                var head1 = []
                $.each(head,function(k,v){
                    if(!exclude.includes(v.name) && !v.hidden ){
                        head1.push(v)
                    }
                })
                head = head1
                config._head = head1;
                // 过滤隐藏列,生产_head 头对象

                $.each(head,function(k,v){
                    var e = 'e' + k
                    config.KEY[e] = v.name
                    _head[ e ] = v.label
                    config._colConf[LAY_EXCEL.numToTitle(k + 1)] = v.width
                })

                // 这里很重要
                var _headIndex = [];
                var _headObjArr = {}

                $.each(_head,function(k,v){
                    _headIndex.push(k);
                    _headObjArr[k] = [];
                    config.headLength ++ ;
                })

                /*复杂表头合并数据生成*/
                var _groupHeaderData = [];
                if(groupHeader && defauls.showHead){
                    var _mergeConf = config.mergeConf;
                    $.isArray(groupHeader) ? groupHeader.push({}) : [groupHeader,{}]

                    $.each(groupHeader,function(k,v){
                        var _rowText = {};
                        var _k = k+1;
                        var _i = 0;
                        var _group = v['groupHeaders'];
                        var _j = 0;
                        var _exclude = [];

                        for(var j = 0; j < _headIndex.length; j++){
                            var k2=j ,v2=_headIndex[j]; //a
                            // 通过groupHeader 进行横向(列)合并 生成复合数组_mergeConf
                            if(_group && _group[k2]){
                                var groupItem = _group[k2];
                                _i = groupItem.numberOfColumns
                                _j = k2;
                                var _name = ''
                                $.each(config.KEY,function(n,s){
                                    if(groupItem.startColumnName.includes(s)){
                                        _name = n
                                    }
                                })
                                var _index = $.inArray(_name, _headIndex);

                                _mergeConf.push([LAY_EXCEL.numToTitle(_index + 1) + _k , LAY_EXCEL.numToTitle(_index + groupItem.numberOfColumns) + _k])

                                _rowText[_name] = groupItem.titleText
                                for(var k5 = _index ; k5 < _index + _i; k5++){
                                    _exclude.push(_headIndex[k5])
                                }
                            }
                            // 排除横向(列)合并的name值, 生成纵向(行)合并
                            if($.inArray(v2 , _exclude) == -1){
                                if(_headObjArr[v2].length ){
                                    _headObjArr[v2][1] = (LAY_EXCEL.numToTitle(k2 + 1) + _k)
                                }else{
                                    _headObjArr[v2][0] = (LAY_EXCEL.numToTitle(k2 + 1) + _k)
                                }
                            }
                        }
                        _groupHeaderData.push( $.extend({},_head,_rowText));
                    })
                    $.each(_headObjArr,function(k,v){
                        if(v && v.length>1){
                            _mergeConf.push(v)
                        }
                    })
                }else{
                    _groupHeaderData.push(_head);
                }

                /*跨行合并数据*/
                config.setRowMerger();

                // 根据_head 表头 过滤多余数据
                $.each(data,function(index,item){
                    var _obj = {}
                    $.each(_head,function(key,val){
                        _obj[key] = item[config.KEY[key]]
                    })
                    _data.push(_obj)
                })

                config.data = defauls.showData ? _data : [];
                // 合计行
                if(defauls.total.show){
                    config.total();
                }

                if(defauls.showHead ){
                    config.data=_groupHeaderData.concat(config.data);
                }
            },
            downdload:function(){
                var def = defauls.download;
                var data =  def.data;
                var exclude =defauls.exclude;
                var head;
                var flag = true;

                if(def.head){
                    if($.isArray(def.head)){
                        if(def.head[0]){
                            head = def.head[0]
                        }else{
                            head = data[0];
                            flag = false;
                        }
                    }
                }else {
                    flag = false;
                    head = data[0];
                }
                // 过滤
                $.each(exclude,function(k,v){
                    if(head && head[v]){
                        delete head[v]
                    }
                    $.each(data,function(k1,v1){
                        if(v1[v]){
                            delete v1[v]
                        }
                    })
                })

                // 获取head 的长度
                $.each(head,function(k,v){
                    config.headLength ++
                })

                config.head =  defauls.showHead ? head : [];
                config.data = defauls.showData ? data : [];

                if(defauls.total.show){
                    config.total();
                }
                if(flag){
                    config.data.unshift(config.head);
                }
            },
            total:function(){
                var total = defauls.total
                var data = config.data;
                var _total = {}; // 第一合计行对象
                var _head = config.head;
                var _totalObj = {};
                var _totalFirdtKey ;

                $.extend(_total,_head);

                // 获取第一个属性key值
                if(total.position){
                    $.each(_total,function(k,v){
                        _total[k] = ''
                    })
                    _totalFirdtKey = total.position
                }else{
                    // 获取第一个属性值
                    var _totalFirdtValue = get_object_first(_total);
                    function get_object_first(data){
                        for (var key in data)
                            return data[key];
                    }
                    $.each(_total,function(k,v){
                        if(v == _totalFirdtValue) _totalFirdtKey = k
                        _total[k] = ''
                    })
                }

                // 求和
                _totalObj[_totalFirdtKey] = total.label

                $.each(total.data,function(index,item){
                    var num = 0;
                    $.each(data,function(k,v){
                        num += Number(v[item]) || 0;
                    })
                    _totalObj[item] = num;
                })
                $.extend(_total,_totalObj);
                config.data.push(_total)
            }
        }

        if(defauls.gridId){
            config.gridDown();
        }else{
            config.downdload();
        }

        // 设置excel 设置文件居中
        var rangeRow = LAY_EXCEL.numToTitle( config.headLength)
        var range = 'A1:'+ rangeRow + config.data.length;

        // 设置合并
        var mergeConf = LAY_EXCEL.makeMergeConfig(config.mergeConf)

        // 设置列宽度
        var colConf = LAY_EXCEL.makeColConfig(config._colConf, 80);
        // 设置单元格样式
        LAY_EXCEL.setExportCellStyle(config.data, range, {
            s: {
                alignment: {
                    horizontal: 'center',
                    vertical: 'center'
                },
                border:{
                    top:{style: 'thin', color: '#FF000000'},
                    right:{style: 'thin', color: '#FF000000'},
                    bottom:{style: 'thin', color: '#FF000000'},
                    left:{style: 'thin', color: '#FF000000'}
                },
                fill: { bgColor: { indexed: 64 }, fgColor: { rgb: "FFF0F6F6" }}
            }
        })

        if(defauls.showHead){
            var heardRange = 'A1:'+ rangeRow + (config._groupHeader.length ? config._groupHeader.length : 1);

            // 设置表头样式
            LAY_EXCEL.setExportCellStyle(config.data, heardRange, {
                s: {
                    fill: { bgColor: { indexed: 64 }, fgColor: { rgb: "FFE7EBEF" }}
                }
            })
        }

        LAY_EXCEL.exportExcel({ sheet1:config.data }, defauls.fileName+ '.' + defauls.fileType, defauls.fileType, {
            extend: {
                sheet1: {
                    '!merges': mergeConf,
                    '!cols': colConf
                }
            }
        })
    },

jqgrid导出 excel / pdf 

    <script type="text/javascript" src="jquery-1.11.1.min.js"></script>
    <!--    <script type="text/javascript" src="polyfill.js"></script>-->
    <!--    <script type="text/javascript" src="exceljs.bare.js"></script>-->
    <script type="text/javascript" src="exceljs.js"></script>
    <script type="text/javascript" src="FileSaver.js"></script>
    <script type="text/javascript" src="jquery.fileDownload.js"></script>
    <script type="text/javascript" src="layer.js"></script>




    exportReport: function(opts){

        var defauls = {
            contentWindow:window,                     // 目标window
            fileType: 'xlsx',                         // 文件类型 支持 xlsx、csv、ods、xlsb、fods、biff2
            fileName: '导出excel数据',                 // 文件名称
            isExport:true,                            // 是否导出excel
            excludeName:['rn','cb'],                  // 过滤不显示列名称
            exportPdf:{
                show:false,                           // 是否需要导出pdf
                fileType:'.pdf',                      // pdf 文件后缀
                postUrl:'',                           // 提交Excel生产数据,用于后台转换
                downloadUrl:''                        // 下载pdf服务url
            },
            ColWidth:15,                              // 默认列宽
            backgroundColor:'',                       // 模板背景色
            tableHeadColor:'',                        // 表格表头颜色
            tableBodyColor:'',                        // 表格表身颜色(暂不支持)
            groupHeaders: [                           // 表头合并参数
                // {
                //     useColSpanStyle: true,         // 是否跨行合并,同jqgrid的API 一样
                //     groupHeaders: [
                //         {   startColumnName: 'a',  // 可以合并列名称
                //             numberOfColumns: 10,   // 列合并数量
                //             titleText: '一级标题合并'// 合并标题
                //         }
                //     ]
                // },
            ],
            rowMerger:[                               // 行合并规律数据
                // {name: 'a',gist:['a']},            // name 为a 的列, 相隔行相同值跨行合并
                // {name: 'c',gist:['a','c']},        // name 为c 的列,a列并且c列相隔行相同值跨行合并
            ],
            title:{
                show: false,                          // 是否显示
                text: '',                             // 名称
                titleStyle:{                          // 标题样式
                    height:60,                        // 行高
                    font:{
                        size: 22,                     // 字体
                        color: { argb: 'FF000000' },  // 颜色
                        bold: true                    // 是否加粗
                    },
                    alignment:{
                        vertical: 'middle',           // 垂直居中
                        horizontal: 'center'          // 水平居中
                    },
                    // fill:{                         // 背景色填充(可查看api)
                    //     type: 'pattern',
                    //     pattern:'darkTrellis',
                    //     fgColor:{argb:'FFFFFFFF'},
                    //     bgColor:{argb:'FFFFFFFF'}
                    // }
                }
            },
            tableBefore:{                             // 表格前文字排列
                show:false,                           // 是否显示表前文字
                data:[
                    // [{text:'测试ccc'}],             // text 显示文字,textStyle 单个样式,规则和标题一样
                    // [{text:'测试aaa',textStyle:{font:{size: 14,bold: true}}},{text:'测试bbb'}],
                ],
                textStyle:{                           // 通用表前文字样式
                    height:20,
                    font:{
                        size: 13,
                        color: { argb: 'FF000000' },
                        bold: false
                    },
                    alignment:{ vertical: 'middle', horizontal: 'center' },
                }
            },
            tableAfter:{                              // 表格后文字排列
                show:false,
                data:[
                    // [{text:'说明111 ',textStyle:{font:{size: 13,bold: true},align:'left'}}],
                    // [{text:'说明222',textStyle:{font:{size: 15,bold: true}, alignment:{ vertical: 'middle', horizontal: 'right' }}}]
                ],
                textStyle:{
                    height:20,
                    font:{
                        size: 12,
                        color: { argb: 'FF000000' },
                        bold: false
                    },
                    alignment:{ vertical: 'middle', horizontal: 'center' },
                }
            },
            image:{
                show:false,                           // 是否显示图片
                data:[
                    {
                        title:'',                     // 图片标题
                        titleStyle:{                  // 标题样式,规则一样
                            height:25,
                            font:{
                                size: 13,
                                color: { argb: 'FF000000' },
                                bold: true
                            },
                            alignment:{ vertical: 'middle', horizontal: 'center' }
                        },
                        echartId:'',                 // 页面echarts id ,(有则默认优先使用该元素canvs转换的base64图片)
                        src:{                        // 图片类型,可以查看api(将图片添加到工作簿)
                            base64: '',
                            extension: 'png',
                        },
                        config:{                     // 图片位置,可以查看api
                            tl: { col: 0, row: 0 },
                            ext: {  800, height: 300 },
                            editAs: 'oneCell'
                        }
                    }
                ]
            },
            table:{
                gridId:'',                            // 页面jqgrid 表格id (自定义jqrid插件内置适应,有则优先使用jqgrid的数据)
                title:'',                             // 表格标题
                titleStyle:{                          // 表格表头样式,规则一样
                    height:25,
                    font:{
                        size: 13,
                        color: { argb: 'FF000000' },
                        bold: true
                    },
                    alignment:{ vertical: 'middle', horizontal: 'center' },
                },
                name: 'MyTable',                      // 内部表格name标识(可不设置)
                ref: 'A1',                            // 表格左上角位置(可以不设置内部自动计算位置)
                headerRow: true,                      // 是否显示表头
                bodyRow:true,                         // 是否行显示数据(自定义功能,模板下载时有用)
                totalsRow: false,                     // 合计,工具行是否显示
                style: {                              // 插件内部主题
                    theme: null,                      // 默认主题名称
                    showFirstColumn: false,           // 突出显示第一列(粗体)
                    showLastColumn: false,            // 突出显示最后一列(粗体)
                    showRowStripes: false,            // 用交替的背景色显示行
                    showColumnStripes: false          // 用交替的背景色显示列
                },
                columns: [                            // 列表头数据
                                                      // _name 数据里的数据里的的属性名
                    // {name: '时间', _name: 'time', totalsRowLabel: 'Totals:', filterButton: true},
                    // {name: '总计', _name: 'amount', totalsRowFunction: 'sum', filterButton: false},
                ],
                rows: [                               // 行数据(插件原规定数据)
                    // [new Date('2019-07-20'), 70.10],
                    // [new Date('2019-07-21'), 70.60],
                ],
                rowData:[                             // 行数据(自定义常规数据)
                    // {time:new Date('2019-07-20'),amount:70.10}
                ]
            },
            callBack:null                             // 返回数据回调
        }

        var _excludeName = [].concat(defauls.excludeName);
        $.extend(true,defauls,opts);
        defauls.excludeName = defauls.excludeName.concat(_excludeName);
        var workbook = new ExcelJS.Workbook();
        workbook.properties.date1904 = true;
        workbook.calcProperties.fullCalcOnLoad = true;
        workbook.views = [{ x: 0, y: 0,  10000, height: 20000, firstSheet: 0, activeTab: 1, visibility: 'visible'}];
        var worksheet = workbook.addWorksheet(defauls.fileName);

        var opt = {
            // 表格默认样式
            tableCellStyle:{
                border:{top: {style:'thin'},left: {style:'thin'}, bottom: {style:'thin'},right: {style:'thin'}},
                alignment:{vertical: 'middle', horizontal: 'center'}
            },
            // 表头数据
            header:[],
            // numsToTitle备忘录提效
            numsTitleCache: {},
            // titleToTitle 备忘录提效
            titleNumsCache: {},
            // 模块数据统计
            rowNumObj:{
                title:{num:0,startNum:0},
                tableBefore:{num:0,startNum:0},
                table:{num:0,startNum:0},
                tableHeard:{num:0,startNum:0},
                tableAfter:{num:0,startNum:0}
            },
            rowNum:0,
            colNum:0,
            excludeIndex:[],
            //将数字(从一开始)转换为 A、B、C...AA、AB
            numToTitle: function(num) {
                if (this.numsTitleCache[num]) {
                    return this.numsTitleCache[num];
                }
                var ans = '';
                if (num > 26) {
                    // 要注意小心 26 的倍数导致的无限递归问题
                    var dec = num % 26;
                    ans = this.numToTitle((num - dec)/26) + this.numToTitle(dec?dec:26);
                    this.numsTitleCache[num] = ans;
                    this.titleNumsCache[ans] = num;
                    return ans;
                } else {
                    // A 的 ascii 为 0,顺位相加
                    ans = String.fromCharCode(64 + num);
                    this.numsTitleCache[num] = ans;
                    this.titleNumsCache[ans] = num;
                    return ans;
                }
            },
            // 将A、B、AA、ABC转换为 1、2、3形式的数字
            titleToNum: function(title) {
                if (this.titleNumsCache[title]) {
                    return this.titleNumsCache[title];
                }
                var len = title.length;
                var total = 0;
                for (var index in title) {
                    if (!title.hasOwnProperty(index)) {
                        continue;
                    }
                    var char = title[index];
                    var code = char.charCodeAt() - 64;
                    total += code * Math.pow(26, len - index - 1);
                }
                this.numsTitleCache[total] = title;
                this.titleNumsCache[title] = total;
                return total;
            },
            // 设置表格表头数据
            setHeard:function(){
                var _table = defauls.table;
                var _columns = [];
                var that = this;
                if(_table.gridId){
                    var GridParam = $(defauls.contentWindow.document).find("#"+_table.gridId).jqGrid('getGridParam');
                    var _head = $.map(GridParam.colModel,function(n){ return !n.hidden ? n : null;});


                    $.each(_head,function(k,v){
                        v._name = v.name;
                        v.name = v.label;

                        $.each(_table.columns,function(dk,dv){
                            if(v._name == dv._name ){
                                $.extend(v,dv);
                            }
                        })
                    })
                    _table.columns = _head;
                }

                // 过滤
                if(_table.columns.length){
                    $.each(_table.columns,function(k,v){
                        var flag = true;
                        v.style = that.tableCellStyle;
                        $.each(defauls.excludeName,function(ek,ev){
                            if(v._name == ev){ that.excludeIndex.push(k); flag = false; }
                        })
                        if(flag){_columns.push(v);}
                    })
                }

                // 设置列宽
                $.each(_columns,function(k,v){
                    var dobCol = worksheet.getColumn(k+1);
                    dobCol.width = v.width / 10 || defauls.ColWidth;
                })

                // console.log(_columns)
                that.header = _columns;
                defauls.table.columns = _columns;
                that.colNum = _columns.length;
            },
            // 设置大标题
            setTitle:function(){
                var that = this;
                var _title = defauls.title;
                // worksheet.spliceRows(1, 1, ['表头']);
                if(_title.show){
                    var row = worksheet.addRow([_title.text]);
                    worksheet.mergeCells('A1:' + that.numToTitle(that.colNum) + 1);
                    var cell = worksheet.getCell('A1');
                    row.height = defauls.title.titleStyle.height;
                    $.extend(cell,defauls.title.titleStyle);

                    that.rowNumObj.title.num = 1;
                    that.rowNumObj.title.startNum = 1;
                    that.rowNum = 1
                }
            },
            // 设置表格前数据
            setTableBefore:function(){
                this.setGridFn('tableBefore');
            },
            // 设置布局方法
            setGridFn:function(moduleName){
                var that = this;
                var _tb = defauls[moduleName];
                if(_tb.show) {
                    var _num = _tb.data.length;

                    $.each(_tb.data, function (k, v) {
                        var row = worksheet.getRow(k + that.rowNum + 1);
                        var space = parseInt(that.colNum / v.length);
                        row.height = _tb.textStyle.height;
                        var _rowNum = k + that.rowNum + 1;
                        var _surplus = that.colNum - v.length * space;

                        // 累加计算结束列
                        var _colNum = 1;
                        $.each(v, function (vk, vv) {
                            var _vNum = 0;
                            if (_surplus) {
                                _vNum = 1;
                                _surplus--;
                            }

                            var colNum_ = _colNum + space + _vNum - 1;
                            var cell = row.getCell(_colNum);
                            var _cellObj = vv.textStyle ? $.extend(true, {}, _tb.textStyle, vv.textStyle) : _tb.textStyle;
                            row.height = _cellObj.height;
                            $.extend(cell, {value: vv.text}, _cellObj);
                            worksheet.mergeCells(that.numToTitle(_colNum) + _rowNum + ':' + that.numToTitle(colNum_) + _rowNum);
                            _colNum = colNum_ + 1;
                        })

                    })
                    that.rowNumObj[moduleName].startNum = that.rowNum;
                    that.rowNumObj[moduleName].num = _num;
                    that.rowNum = _num + that.rowNum;
                }
            },
            // 设置合并表头
            setGroupHeaders:function(startRowNum){
                var that = this;
                var groupHeaders = defauls.groupHeaders;
                var _headIndex = [];
                var _headObjArr = {};
                var _configKey = {};

                $.each(that.header,function(k,v){
                    _headIndex.push('e'+k);
                    _headObjArr['e'+k] = [];
                    _configKey['e'+k] = v._name
                })

                if(groupHeaders && groupHeaders.length > 0){

                    var _k = 0;
                    $.each(groupHeaders,function(k,v){
                        var _rowText = {};
                        _k = startRowNum + k ;
                        var _i = 0;
                        var _group = v['groupHeaders'];
                        var _j = 0;
                        var _exclude = [];
                        worksheet.duplicateRow(_k,1,true);

                        for(var j = 0; j < _headIndex.length; j++){
                            var k2=j ,v2=_headIndex[j]; //a
                            // 通过groupHeader 进行横向(列)合并 生成复合数组_mergeConf
                            if(_group && _group[k2]){
                                var groupItem = _group[k2];
                                _i = groupItem.numberOfColumns
                                _j = k2;

                                var _name = ''
                                $.each(_configKey,function(n,s){
                                    if(groupItem.startColumnName.includes(s)){
                                        _name = n
                                    }
                                })

                                var _index = $.inArray(_name, _headIndex);

                                worksheet.mergeCells(that.numToTitle(_index +1 ) + _k +
                                    ':'+ that.numToTitle(_index + groupItem.numberOfColumns) + _k);

                                worksheet.getCell(that.numToTitle(_index +1 ) + _k ).value = groupItem.titleText;

                                _rowText[_name] = groupItem.titleText
                                for(var k5 = _index ; k5 < _index + _i; k5++){
                                    _exclude.push(_headIndex[k5])
                                }
                            }

                            // 排除横向(列)合并的name值, 生成纵向(行)合并
                            if($.inArray(v2 , _exclude) == -1){
                                if(_headObjArr[v2].length ){
                                    _headObjArr[v2][1] = (that.numToTitle(k2 + 1) + _k)
                                }else{
                                    _headObjArr[v2][0] = (that.numToTitle(k2 + 1) + _k)
                                }
                            }
                        }
                    })

                    // 纵向合并添加原有表头
                    $.each(_headIndex,function(k,v){
                        var _key = _k + 1;
                        if(_headObjArr[v].length ){
                            _headObjArr[v][1] = (that.numToTitle(k + 1) + _key);
                        }else{
                            _headObjArr[v][0] = (that.numToTitle(k + 1) + _key);
                        }
                    })

                    // 表头纵向合并
                    $.each(_headObjArr,function(k,v){
                        if(v && v.length > 1){
                            worksheet.mergeCells(v[0] + ':' + v[1]);
                        }
                    })

                    that.rowNum = that.rowNum + groupHeaders.length;
                }

                /*
                                $.each(groupHeaders,function(gk,gv){
                                    var _rowNum = startRowNum + gk,
                                        _row = {},
                                        _num = 0,
                                        _j = 0 ,
                                        _group = gv['groupHeaders'],
                                        _exclude = [];
                                    // console.log(gk,gv)
                                    worksheet.duplicateRow(_rowNum,1,true);

                                    $.each(that.header,function(hk,kv){
                                        var _colStartNum = hk;
                                        if(_group ) {
                                            $.each(_group, function (gk,gv) {
                                                if(gv.startColumnName == kv.name){
                                                    var _num = gv.numberOfColumns;
                                                    worksheet.mergeCells(that.numToTitle(_colStartNum +1 ) + _rowNum +
                                                        ':'+ that.numToTitle(_colStartNum + _num) + _rowNum);
                                                    worksheet.getCell(that.numToTitle(_colStartNum + 1) + _rowNum).value = gv.titleText;
                                                }
                                            })
                                        }
                                    })
                                })
                                */


            },
            // 设置行合计方法
            setRowMergerFn:function(data){
                var that = this;
                var table = defauls.table;
                var rows = table.rows;
                var heard = table.columns;
                var _rows = [];
                var length = rows.length;
                var rowids = [];

                $.each(rows,function(rk,rv){
                    rowids.push(rk);
                    var _col = {}
                    $.each(rv,function(ck,cv){
                        _col[heard[ck]['_name']] = cv
                    })
                    _rows.push(_col);
                })

                function flagFn(start,end,arr){
                    if(start && end){
                        var flag = true
                        $.each(arr,function(k,v){
                            if(start[v] != end[v]){
                                flag = false
                            }
                        })
                        return flag
                    }
                }
                var cellObj = {}
                var deleteObj = {}

                $.each(data, function(k,v){
                    var num = v.num;
                    var CellName = v.name;
                    cellObj[CellName] = {};
                    deleteObj[CellName] = {};

                    if(!num){
                        for (var i = 0; i < length; i++) {
                            var before = _rows[i];//从上到下获取一条信息
                            var rowSpanTaxCount = 1;//定义合并行数
                            for (var j = i + 1; j <= length; j++) {
                                //和上边的信息对比 如果值一样就合并行数+1 然后设置rowspan 让当前单元格隐藏
                                var end = _rows[j];

                                if (flagFn(before,end,v.gist)) {
                                    rowSpanTaxCount++;
                                } else {
                                    rowSpanTaxCount = 1;
                                    break;
                                }
                                cellObj[CellName][v.name + "" + rowids[i]] = [i+1, rowSpanTaxCount];
                                deleteObj[CellName][v.name + "" + rowids[j]] = [j+1, rowSpanTaxCount];
                            }
                        }
                    }
                    else{
                        for (var i = 0; i < length; i++) {
                            for (j = i + 1; j <= length; j++) {
                                if(j%num != 0){
                                }
                                cellObj[CellName][v.name + "" + rowids[i]] = [i+1, num];
                                deleteObj[CellName][v.name + "" + rowids[j]] = [j+1, num];
                            }
                        }
                    }
                })
                $.each(cellObj,function(k,v){
                    $.each(deleteObj[k],function(dk,dv){
                        if(v[dk]){
                            delete v[dk]
                        }
                    })
                })
                return cellObj
            },
            // 设置行合并
            setRowMerger:function(startRowNum){
                var that = this;

                var _heardNum = startRowNum;
                var _rowMerger = defauls.rowMerger;
                if(_rowMerger,_rowMerger.length){
                    var _rowMergerData = that.setRowMergerFn(_rowMerger);
                    $.each(that.header,function(k,v){
                        $.each(_rowMergerData,function(rk,rv){
                            if(v._name == rk ){
                                $.each(rv,function(jk,jv){
                                    worksheet.mergeCells(that.numToTitle(k + 1) + (jv[0] + _heardNum) + ':'
                                        + that.numToTitle(k + 1) + (jv[0] + _heardNum + jv[1] - 1));
                                })
                            }
                        })
                    })
                }
            },
            // 获取jqgrid 的数据
            setRowData:function(){
                var that = this;
                var _table = defauls.table;
                var _gridData = [];
                var _gridRows = [];
                var _tableRows = [];

                if(_table.gridId){
                    // console.log($.jgrid,$(defauls.contentWindow.document).find("#"+_table.gridId).jqGrid())
                    var GridParam = $(defauls.contentWindow.document).find("#"+_table.gridId).jqGrid('getGridParam');
                    // console.log(GridParam)
                    _gridData = GridParam.data;
                }
                _gridData = _gridData.concat(_table.rowData);

                // 所有行数据
                $.each(that.header,function(k,v){

                    // 表头数据用以过滤
                    $.each(_gridData,function(gk,gv){
                        if(gv){
                            var _val = gv[v._name] ? gv[v._name]  : '';

                            if(_gridRows[gk]){

                                _gridRows[gk].push(_val)

                            }else{
                                _gridRows[gk] = [_val];

                            }
                        }
                    })
                })

                // 根据过滤索引去除多余数据
                if(that.excludeIndex.length){
                    $.each(_table.rows,function(rk,rv){
                        var _tableCols = [];
                        $.each(rv,function(ck,cv){
                            var flag = true;
                            $.each(that.excludeIndex,function(k,v){
                                if(ck == v){flag = false;}
                            })
                            if(flag){ _tableCols.push(cv); }
                        })
                        _tableRows.push(_tableCols);
                    })
                    _table.rows = _tableRows;
                }

                _table.rows = _table.rows.concat(_gridRows);
            },
            // 表格设置
            setTable:function(){
                var that = this;
                var _table = defauls.table;

                // 设置表格数据
                that.setRowData();
                var _num = 0 ;
                if(_table.title){
                    _num = 1;

                    var titleRow = worksheet.getRow(that.rowNum + 1);
                    worksheet.mergeCells(that.numToTitle(1) + (that.rowNum + 1) + ':' + that.numToTitle(that.colNum) +  (that.rowNum + 1));
                    var cell = titleRow.getCell(1);
                    var _cellObj = _table.titleStyle;
                    titleRow.height = _cellObj.height;
                    $.extend(cell,{value:_table.title},_cellObj);
                }

                _table.ref = 'A' + (that.rowNum + 1 + _num);
                worksheet.addTable(_table);

                var table = worksheet.getTable(_table.name);

                that.setGroupHeaders(that.rowNum + 1 + _num);
                that.setRowMerger(that.rowNum + 1 + _num);

                that.rowNumObj.table.num =  table.tableHeight;
                that.rowNumObj.table.startNum =  that.rowNum + 1 + _num;
                that.rowNum =  that.rowNum + table.tableHeight  + _num;
            },
            // 设置表格后数据
            setTableAfter:function(){
                this.setGridFn('tableAfter');
            },
            // 设置图片
            setImg:function(){
                var that = this;
                var _img = defauls.image;
                if(_img.show){

                    $.each(_img.data,function(k,v){
                        var _num = 0;
                        var _colS = v.config.tl.col ? v.config.tl.col : v.config.tl.col + 1;
                        // 图片标题
                        if(v.title){
                            _num ++;
                            var titleRow = worksheet.getRow(that.rowNum + 1);
                            worksheet.mergeCells(that.numToTitle(_colS) + (that.rowNum + 1) + ':' + that.numToTitle(that.colNum) +  (that.rowNum + 1));
                            var cell = titleRow.getCell(_colS);
                            var _cellObj = v.titleStyle ?  $.extend(true,{},_img.titleStyle,v.titleStyle) : _img.titleStyle;
                            titleRow.height = _cellObj.height;
                            $.extend(cell,{value:v.title},_cellObj);
                        }

                        if(v.echartId){
                            // v.src.base64 = defauls.contentWindow.document.getElementById(v.echartId).toDataURL();
                            v.src.base64 =$(defauls.contentWindow.document).find("#"+v.echartId).find('canvas').get(0).toDataURL();
                        }

                        // 图片
                        worksheet.mergeCells(that.numToTitle(_colS) + (that.rowNum + 1 + _num) + ':' + that.numToTitle(that.colNum) +  (that.rowNum + 1 + _num));
                        var row = worksheet.getRow(that.rowNum + 1 + _num);
                        row.height = v.config.ext.height;

                        var imageId = workbook.addImage(v.src);
                        v.config.tl.row = that.rowNum + _num ;
                        worksheet.addImage(imageId, v.config);

                        that.rowNum = that.rowNum + 1 + _num;
                    })
                }
            },
            // 设置背景
            setBackground:function(){
                var that = this;
                if(defauls.tableHeadColor){
                    // table:{num:0,startNum:0},
                    var gh = groupHeaders && groupHeaders.length ? groupHeaders.length : 0;
                    worksheet.addConditionalFormatting({
                        ref: 'A'+ (that.rowNumObj.table.startNum - gh) +':' + that.numToTitle(that.colNum) + (that.rowNumObj.table.startNum),
                        rules: [
                            {
                                type: 'expression',
                                // formulae: ['MOD(ROW()+COLUMN(),2)=0'],
                                formulae: ['1'],
                                style: {fill: {type: 'pattern', pattern: 'solid', bgColor: {argb: defauls.tableHeadColor}}},
                            }
                        ]
                    })
                }

                if(defauls.backgroundColor){
                    worksheet.addConditionalFormatting({
                        ref: 'A1:' + that.numToTitle(that.colNum) + (that.rowNum),
                        rules: [
                            {
                                type: 'expression',
                                // formulae: ['MOD(ROW()+COLUMN(),2)=0'],
                                formulae: ['1'],
                                style: {fill: {type: 'pattern', pattern: 'solid', bgColor: {argb: defauls.backgroundColor}}},
                            }
                        ]
                    })
                }
            },
            // 下载pdf
            downloadPDF:function(fileId,fileName,suffix){
                var pdf = defauls.exportPdf;
                if(pdf.show && pdf.downloadUrl){
                    if(!$.fileDownload){return;}
                    $.fileDownload(pdf.downloadUrl,{
                        httpMethod: 'post',
                        data: { "fileId":fileId,"fileName":fileName,"suffix":suffix},
                        prepareCallback:function(url){
                            layer.msg('下载开始,请稍等.....')
                        },
                        abortCallback:function(url){
                            layer.msg("文件下载异常",{icon:2});
                        },
                        successCallback:function(url){
                            layer.msg( "下载成功",{icon:1});
                        },
                        failCallback: function (html, url,error) {
                            layer.msg( '下载失败',{icon:2});
                        }
                    });
                }


            },
            // 保存下载
            saveAs:function(){
                workbook.xlsx.writeBuffer().then((data)=>{

                    if(defauls.isExport){
                        var blob = new Blob([data], {type:'application/octet-stream'});
                        var name = defauls.fileName + '.'+ defauls.fileType;
                        saveAs(blob,name);
                    }

                    if(defauls.exportPdf.show && defauls.exportPdf.postUrl){
                        $.ajax({
                            url: defauls.exportPdf.postUrl,
                            contentType: 'application/octet-stream',
                            type: 'post',
                            // 设置的是请求参数
                            data: JSON.stringify(data),
                            // 用于设置响应体的类型 注意 跟 data 参数没关系!!!
                            // dataType: 'json',
                            success: function (res) {
                                if (res.success==true){
                                    that.downloadPDF(res.data,defauls.fileName,defauls.exportPdf.fileType)
                                }
                            }
                        });
                    }

                    if($.isFunction(defauls.callBack)){
                        defauls.callBack(data);
                    }
                })
            },
            init:function(){
                this.setHeard()
                this.setTitle();
                this.setTableBefore();
                this.setTable();

                this.setTableAfter();
                this.setImg()

                this.setBackground();
                this.saveAs()
            }
        }

        opt.init();
    }
View Code
原文地址:https://www.cnblogs.com/ysxq/p/11176493.html