使用JS導出表格數據至Excel的體驗 -- 含源碼分析

首先,感謝原作者的整理與創作 – JS 導出 Excel 代碼部分貢獻:
JS導出excel 兼容ie、chrome、firefox – 分析對象
HTML用JS導出Excel的五種方法

自述:
之前做的一個項目客戶要求 Excel 導出數據的功能;
一般來說,我會選擇 poi.jar 來完成 Excel 導出功能;
但是…我爲了省事,而選擇了 JS 來完成這項工作;
當時沒多想,隨便在網上找了些代碼,Chrome 瀏覽器上一跑就完事;
果不其然,JS 導出 Excel 坑有很多,着實不推薦這麼搞;
以下爲源碼分析:

/**
 * 源碼主要分爲3個部分:
 * 1.獲取瀏覽器類型
 * 2.IE瀏覽器表格導出
 * 3.其他主流瀏覽器導出
 */

/* 1.獲取瀏覽器類型 */
function  getExplorer() {
    var explorer = window.navigator.userAgent;
    //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';
    }
}

這段代碼並不難懂
window.navigator.userAgent:得到當前 訪問者代理頭信息,格式一般如下:
Chrome 瀏覽器結果:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36

那麼,拿到了 訪問者代理頭信息,我們便可以粗略的判斷一下其瀏覽器類型;

但是:這段代碼並不能準確的獲取瀏覽器類型;

我在 win10 操作系統上的 IE 11 瀏覽器運行以上代碼,其不能發現我是 IE 瀏覽器…(原因在於,微軟在 IE 11 上去掉了 MSIE 標識 )

只用 .index.Of(str) 這樣的函數去判斷,是不準確的;至於爲什麼,仔細看看 訪問者代理頭 信息即可知道,Chrome 瀏覽器的 訪問者代理頭信息 居然有 AppleWebKitSafari 等標識…這則是另外一個故事了:
瀏覽器野史 UserAgent列傳(上)瀏覽器野史 UserAgent列傳(下)

關於 JS 判斷 瀏覽器類型 的代碼推薦:
JS獲取當前瀏覽器及版本信息

<!-- HTML代碼,` table `爲表格id -->
<input type="button" value="導出EXCEL" onclick="method1('table')" />

/* 2.IE瀏覽器表格導出 */
function method1(tableid) {
    // 如果是IE瀏覽器
    if(getExplorer()=='ie') {
        var curTbl = document.getElementById(tableid);
        var oXL = new ActiveXObject("Excel.Application");

        //創建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("Excel.xls", "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("Cleanup();",1);
            idTmr = window.setInterval("Cleanup();", 1);
        }
    } else {
        tableToExcel('ta')
    }
}

之前已經說了,由於第一部分代碼無法準確的判斷 瀏覽器類型,以至於這段代碼對於 IE 11 是失效的…
關於 IE 瀏覽器的 JS 導出 Excel 本人未做過多的瞭解,此段代碼只能分析至此…

如果你有興趣瞭解,建議從 ActiveXObject 對象開始瞭解;
ActiveXObject 此對象爲 Microsoft 擴展,僅在 Internet Explorer 中受支持;

/* 3.其他主流瀏覽器導出 */
var tableToExcel = (function() {
    var uri = 'data:application/vnd.ms-excel;base64,',
    template = '<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"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>',
    base64 = function(s) {
        return window.btoa(unescape(encodeURIComponent(s)))
    },
    // 下面這段函數作用是:將template中的變量替換爲頁面內容ctx獲取到的值
    format = function(s, c) {
            return s.replace(/{(\w+)}/g,
                function(m, p) {
                    return c[p];
                }
            )
    };
    return function(table, name) {
        if (!table.nodeType) {
            table = document.getElementById(table);
        }
        // 獲取表單的名字和表單查詢的內容
        var ctx = {worksheet: name || 'Worksheet', table: table.innerHTML};
        // format()函數:通過格式操作使任意類型的數據轉換成一個字符串
        // base64():進行編碼
        window.location.href = uri + base64(format(template, ctx));
    }
})();

最後一段代碼,我也沒太仔細研究(其實是看不懂 Σ( ° △ °|||)︴);
那麼就這樣吧,最後總結一下:

JS(前端) 導出 Excel 的優缺點:

優點: 方便;

缺點: 兼容性問題,分頁數據如何全部導出問題,Excel 樣式問題;

各位看官請酌情選擇,我還是滾回去老老實實弄 poi 進行Excel導出吧;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章