js json數(shù)據(jù)導(dǎo)出excel表介褥,支持ie

看標(biāo)題你一定會(huì)覺得很奇怪,js導(dǎo)出excel?直接導(dǎo)出頁(yè)面里的table這不很簡(jiǎn)單嗎递惋?
但是柔滔。。萍虽。睛廊。。杉编。有一些老ui框架的表格沒有導(dǎo)出功能而且dom不是純table構(gòu)成的超全。。邓馒。所以你懂的嘶朱。。光酣。

然后疏遏,這個(gè)前端js功能好寫是好寫,但是讓我考慮兼容性救军?抱歉财异,我覺得不行。
因?yàn)閖son數(shù)據(jù)和頁(yè)面上的表格可能會(huì)順序不一樣唱遭,所以我提供了重置數(shù)據(jù)順序的功能戳寸,就是要讓你按我的數(shù)據(jù)格式傳個(gè)參數(shù)
別亂傳參哦,因?yàn)闆]有判定胆萧,所以代碼的健壯性不好庆揩,可能完全拋不出錯(cuò)誤

html 代碼

<!DOCTYPE html>
<html>  
<head>  
    <meta http-equiv="content-type" content="text/html; charset=utf-8">  
   
    
</head>  
<body>  
    <b id = "title"  >統(tǒng)計(jì)</b>
    <input id="btnExport" type="button"  class="buttonEx" value="導(dǎo)出統(tǒng)計(jì)"  />  
    <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js"></script>
    <script type="text/javascript">
        //js導(dǎo)出excel處理

var exportExcel = {
                idTmr: '',
                fileName: '', //文件名
                tableId: '', //生成table的id
                title: [], //table的大標(biāo)題(占幾列的那種)
                dataPre: [], //拿到的json數(shù)據(jù)
                dataAfter: [], //處理后的json數(shù)據(jù)
                dataNameSort: [], //決定table的小標(biāo)題和的標(biāo)題順序
                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 = [];

                    //如果后臺(tái)傳的數(shù)據(jù)為空俐东,則退出
                    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;
                    //先轉(zhuǎn)化json  
                    var arrData = typeof JSONData != 'object' ? JSON.parse(JSONData) : JSONData;

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

                    //設(shè)置表頭  
                    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>";

                    //設(shè)置數(shù)據(jù)  
                    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("要生成該報(bào)表,必須將瀏覽器須設(shè)置為可使用“ActiveX控件”订晌。IE瀏覽器->工具->Internet選項(xiàng)->安全->自定義級(jí)別->設(shè)置->“對(duì)未標(biāo)記為可安全執(zhí)行腳本的ActiveX控件初始化并執(zhí)行腳本”設(shè)置為啟用虏辫,確定即可。如有疑問锈拨,請(qǐng)點(diǎn)擊瀏覽器的“幫助”了解瀏覽器設(shè)置方法砌庄!");
                        }
                        //創(chuàng)建AX對(duì)象excel 
                        var oWB = oXL.Workbooks.Add();
                        //獲取workbook對(duì)象 
                        var xlsheet = oWB.Worksheets(1);
                        //激活當(dāng)前sheet 
                        var sel = document.body.createTextRange();
                        sel.moveToElementText(curTbl);
                        //把表格中的內(nèi)容移到TextRange中 
                        sel.select;
                        //全選TextRange中內(nèi)容 
                        sel.execCommand("Copy");
                        //復(fù)制TextRange中內(nèi)容  
                        xlsheet.Paste();
                        //粘貼到活動(dòng)的EXCEL中       
                        oXL.Visible = true;
                        //設(shè)置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;
                            //結(jié)束excel進(jìn)程,退出完成
                            //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導(dǎo)出
            $('body').on('click', '#btnExport', function () {
              
                //文件名
                var fileName = $('#pageFooter_title').html() ? $('#pageFooter_title').html() : '統(tǒng)計(jì)表';
                var tableId = 'ta';
                var title = [
                    { "value": "大標(biāo)題",colSpan: 2, "type": "ROW_HEADER_HEADER", "datatype": "string" }  
                    ];
                var dataNameSort = [
                    {
                        'corporation':'一級(jí)標(biāo)題集團(tuán)',
                        'time':'一級(jí)標(biāo)題日期'                     
                    },
                    {
                        'corporation':'二級(jí)標(biāo)題集團(tuán)',
                        'time':'二級(jí)標(biāo)題日期'                     
                    }
                ];
                var dataPre = [
                    {
                        'corporation':'太極集團(tuán)',
                        'time':'2012-5-6' 
                    },
                    {
                        'corporation':'大極集團(tuán)',
                        'time':'2017-4-7' 
                    },
                    {
                        'corporation':'小極集團(tuán)',
                        'time':'2016-4-7' 
                    }
                ];
                //exportExcel.start(文件名, 生成table的id, table的大標(biāo)題奕枢,table的小標(biāo)題, 拿到的json數(shù)據(jù));
                exportExcel.start(fileName, tableId,title, dataNameSort, dataPre);
            })
        
        
    </script>
</body>  
</html>  
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末娄昆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子缝彬,更是在濱河造成了極大的恐慌萌焰,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谷浅,死亡現(xiàn)場(chǎng)離奇詭異扒俯,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)一疯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門撼玄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人墩邀,你說我怎么就攤上這事掌猛。” “怎么了眉睹?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵荔茬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我竹海,道長(zhǎng)兔院,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任站削,我火速辦了婚禮,結(jié)果婚禮上孵稽,老公的妹妹穿的比我還像新娘许起。我一直安慰自己,他們只是感情好菩鲜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布园细。 她就那樣靜靜地躺著,像睡著了一般接校。 火紅的嫁衣襯著肌膚如雪猛频。 梳的紋絲不亂的頭發(fā)上狮崩,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音鹿寻,去河邊找鬼睦柴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛毡熏,可吹牛的內(nèi)容都是我干的坦敌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼痢法,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼狱窘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起财搁,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蘸炸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后尖奔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體搭儒,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年越锈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仗嗦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡甘凭,死狀恐怖稀拐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情丹弱,我是刑警寧澤德撬,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站躲胳,受9級(jí)特大地震影響蜓洪,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坯苹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一隆檀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粹湃,春花似錦恐仑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至孤钦,卻和暖如春歧斟,著一層夾襖步出監(jiān)牢的瞬間纯丸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工静袖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留觉鼻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓勾徽,卻偏偏與公主長(zhǎng)得像滑凉,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喘帚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案畅姊? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,737評(píng)論 1 92
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,092評(píng)論 1 32
  • 最近幾天因?yàn)轫?xiàng)目需要做一個(gè)導(dǎo)出導(dǎo)出表格數(shù)據(jù)到Excel功能,我們的項(xiàng)目的前端框架用的是Bootstrap Tabl...
    李北北閱讀 15,696評(píng)論 7 13
  • 青絲三千吹由,了以白發(fā) 馬輪車水若未,人海茫茫 了然貧窮,限我思心 故人不再倾鲫,何以笙簫 蒹葭愛戀粗合,唯夢(mèng)有之 那伊人斯,去往...
    菜泥頭墨小白閱讀 354評(píng)論 0 1
  • 小莢很喜歡姨媽家的陽(yáng)臺(tái)乌昔。她自己家里像個(gè)冰窖隙疚。媽媽很要強(qiáng),又總是一副愁苦的樣子磕道,對(duì)小莢很嚴(yán)厲供屉。于是小莢很喜歡去...
    燕子莊園閱讀 331評(píng)論 0 0