js json数据导出excel表,支持ie

看标题你一定会觉得很奇怪,js导出excel?直接导出页面里的table这不很简单吗?
但是。。。。。。有一些老ui框架的表格没有导出功能而且dom不是纯table构成的。。。所以你懂的。。。

然后,这个前端js功能好写是好写,但是让我考虑兼容性?抱歉,我觉得不行。
因为json数据和页面上的表格可能会顺序不一样,所以我提供了重置数据顺序的功能,就是要让你按我的数据格式传个参数
别乱传参哦,因为没有判定,所以代码的健壮性不好,可能完全抛不出错误

html 代码

<!DOCTYPE html>
<html>  
<head>  
    <meta http-equiv="content-type" content="text/html; charset=utf-8">  
   
    
</head>  
<body>  
    <b id = "title"  >统计</b>
    <input id="btnExport" type="button"  class="buttonEx" value="导出统计"  />  
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <script type="text/javascript">
        //js导出excel处理

var exportExcel = {
                idTmr: '',
                fileName: '', //文件名
                tableId: '', //生成table的id
                title: [], //table的大标题(占几列的那种)
                dataPre: [], //拿到的json数据
                dataAfter: [], //处理后的json数据
                dataNameSort: [], //决定table的小标题和的标题顺序
                start: function (fileName, tableId, title,dataNameSort, dataPre) {
                    this.fileName = fileName;
                    this.tableId = tableId;
                    this.title=title;
                    this.dataNameSort = dataNameSort.reverse();
                    this.dataPre = dataPre;
                    this.dataSortSet();

                },
                dataSortSet: function () {
                    var that = this;
                    //重置dataAfter
                    that.dataAfter = [];

                    //如果后台传的数据为空,则退出
                    if ((this.title == '') || (this.dataPre == '') || (this.dataNameSort == ''))
                    { return; }
                    //插入到最前面
                    $.each(this.dataNameSort, function (i, n) {

                        that.dataPre.unshift(n)
                    })

                 
                    $.each(this.dataPre, function (i, n) {

                        var tempArr = [];

                        $.each(that.dataPre[0], function (j, k) {

                            var tempObj = { "value": n[j], "type": "ROW_HEADER" };

                            tempArr.push(tempObj);

                        });

                        that.dataAfter.push(tempArr)
                    })
                    //将插入的删除
                    $.each(this.dataNameSort, function (i, n) {

                        that.dataPre.splice(0, 1);

                    })
                
                    this.JSONToExcelConvertor(this.dataAfter, this.fileName, this.title, this.tableId);

                },
                JSONToExcelConvertor: function (JSONData, FileName, ShowLabel, tableId) {
                    var that = this;
                    //先转化json  
                    var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData;

                    var excel = '<table id=' + tableId + ' style="display:none">';

                    //设置表头  
                    var row = "<tr>";
                    for (var i = 0, l = ShowLabel.length; i < l; i++) {
                        if (ShowLabel[i].colSpan) {
                            row += "<td colSpan=" + ShowLabel[i].colSpan + ">" + ShowLabel[i].value + '</td>';
                        } else {
                            row += "<td>" + ShowLabel[i].value + '</td>';
                        }
                       
                    }


                    //换行  
                    excel += row + "</tr>";

                    //设置数据  
                    for (var i = 0; i < arrData.length; i++) {
                        var row = "<tr>";

                        for (var j = 0; j < arrData[i].length; j++) {
                            var value = arrData[i][j].value === "." ? "" : arrData[i][j].value;

                            row += '<td>' + value + '</td>';
                        }

                        excel += row + "</tr>";
                    }

                    excel += "</table>";

                    var excelFile = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>";
                    excelFile += '<meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">';
                    excelFile += '<meta http-equiv="content-type" content="application/vnd.ms-excel';
                    excelFile += '; charset=UTF-8">';
                    excelFile += "<head>";
                    excelFile += "<!--[if gte mso 9]>";
                    excelFile += "<xml>";
                    excelFile += "<x:ExcelWorkbook>";
                    excelFile += "<x:ExcelWorksheets>";
                    excelFile += "<x:ExcelWorksheet>";
                    excelFile += "<x:Name>";
                    excelFile += "{worksheet}";
                    excelFile += "</x:Name>";
                    excelFile += "<x:WorksheetOptions>";
                    excelFile += "<x:DisplayGridlines/>";
                    excelFile += "</x:WorksheetOptions>";
                    excelFile += "</x:ExcelWorksheet>";
                    excelFile += "</x:ExcelWorksheets>";
                    excelFile += "</x:ExcelWorkbook>";
                    excelFile += "</xml>";
                    excelFile += "<![endif]-->";
                    excelFile += "</head>";
                    excelFile += "<body>";
                    excelFile += excel;
                    excelFile += "</body>";
                    excelFile += "</html>";






                    if (this.getExplorer() == 'ie') {
                        $('body').append(excel);
                        var curTbl = document.getElementById(tableId);

                        try {
                            var oXL = new ActiveXObject("Excel.Application");
                        }
                        catch (exp) {
                            alert("要生成该报表,必须将浏览器须设置为可使用“ActiveX控件”。IE浏览器->工具->Internet选项->安全->自定义级别->设置->“对未标记为可安全执行脚本的ActiveX控件初始化并执行脚本”设置为启用,确定即可。如有疑问,请点击浏览器的“帮助”了解浏览器设置方法!");
                        }
                        //创建AX对象excel 
                        var oWB = oXL.Workbooks.Add();
                        //获取workbook对象 
                        var xlsheet = oWB.Worksheets(1);
                        //激活当前sheet 
                        var sel = document.body.createTextRange();
                        sel.moveToElementText(curTbl);
                        //把表格中的内容移到TextRange中 
                        sel.select;
                        //全选TextRange中内容 
                        sel.execCommand("Copy");
                        //复制TextRange中内容  
                        xlsheet.Paste();
                        //粘贴到活动的EXCEL中       
                        oXL.Visible = true;
                        //设置excel可见属性

                        try {
                            
                            var fname = oXL.Application.GetSaveAsFilename(FileName, "Excel Spreadsheets (*.xls), *.xls");
                        } catch (e) {
                            print("Nested catch caught " + e);
                        } finally {
                            oWB.SaveAs(fname);

                            oWB.Close(savechanges = false);
                            //xls.visible = false;
                            oXL.Quit();
                            oXL = null;
                            //结束excel进程,退出完成
                            //window.setInterval("that.Cleanup();",1);
                            this.idTmr = window.setInterval(that.Cleanup, 1);
                            //移除excelDOM
                            $remove()
                        }

                    } else {
                        var uri = 'data:application/vnd.ms-excel;charset=utf-8,' + encodeURIComponent(excelFile);

                        var link = document.createElement("a");
                        link.href = uri;
                        link.id = 'xlsDownload';
                        link.style = "visibility:hidden";
                        link.download = FileName + ".xls";
                        document.body.appendChild(link);
                        link.click();
                        document.body.removeChild(link);
                    }
                },
                getExplorer: function () {
                    var explorer = window.navigator.userAgent;
                    var rMsie = /(msie\s|trident.*rv:)([\w.]+)/;
                    var match = rMsie.exec(explorer.toLowerCase());
                    //ie 11
                    if (match != null) {
                        return 'ie';
                    } 
                    //ie 
                    if (explorer.indexOf("MSIE") >= 0) {
                        return 'ie';
                    }
                    //firefox 
                    else if (explorer.indexOf("Firefox") >= 0) {
                        return 'Firefox';
                    }
                    //Chrome
                    else if (explorer.indexOf("Chrome") >= 0) {
                        return 'Chrome';
                    }
                    //Opera
                    else if (explorer.indexOf("Opera") >= 0) {
                        return 'Opera';
                    }
                    //Safari
                    else if (explorer.indexOf("Safari") >= 0) {
                        return 'Safari';
                    }
                },
                Cleanup: function () {
                    window.clearInterval(this.idTmr);
                    window.CollectGarbage();
                }
            }
            
        //添加click事件excel导出
            $('body').on('click', '#btnExport', function () {
              
                //文件名
                var fileName = $('#pageFooter_title').html() ? $('#pageFooter_title').html() : '统计表';
                var tableId = 'ta';
                var title = [
                    { "value": "大标题",colSpan: 2, "type": "ROW_HEADER_HEADER", "datatype": "string" }  
                    ];
                var dataNameSort = [
                    {
                        'corporation':'一级标题集团',
                        'time':'一级标题日期'                     
                    },
                    {
                        'corporation':'二级标题集团',
                        'time':'二级标题日期'                     
                    }
                ];
                var dataPre = [
                    {
                        'corporation':'太极集团',
                        'time':'2012-5-6' 
                    },
                    {
                        'corporation':'大极集团',
                        'time':'2017-4-7' 
                    },
                    {
                        'corporation':'小极集团',
                        'time':'2016-4-7' 
                    }
                ];
                //exportExcel.start(文件名, 生成table的id, table的大标题,table的小标题, 拿到的json数据);
                exportExcel.start(fileName, tableId,title, dataNameSort, dataPre);
            })
        
        
    </script>
</body>  
</html>  
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,727评论 1 92
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 最近几天因为项目需要做一个导出导出表格数据到Excel功能,我们的项目的前端框架用的是Bootstrap Tabl...
    李北北阅读 15,666评论 7 13
  • 青丝三千,了以白发 马轮车水,人海茫茫 了然贫穷,限我思心 故人不再,何以笙箫 蒹葭爱恋,唯梦有之 那伊人斯,去往...
    菜泥头墨小白阅读 350评论 0 1
  • 小荚很喜欢姨妈家的阳台。她自己家里像个冰窖。妈妈很要强,又总是一副愁苦的样子,对小荚很严厉。于是小荚很喜欢去...
    燕子庄园阅读 327评论 0 0