zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    2019暑假——区域赛真题讲解
    2019暑假杭电训练赛(补题及笔记)
    2019暑假牛客训练赛(补题及笔记)
    网络流——最大流-Dinic算法
    SPFA
    K短路(A*+SPFA)
    从业务架构视角聊聊大型商业银行的转型实践
    互联网 40 岁失业是一个无法打破的魔咒吗
    Hadoop集群中出现的节点有哪些作用
    CDH集群的角色划分
  • 原文地址:https://www.cnblogs.com/ysxq/p/11176493.html
Copyright © 2011-2022 走看看