首先,感謝原作者的整理與創作 –
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
瀏覽器的 訪問者代理頭信息
居然有 AppleWebKit
,Safari
等標識…這則是另外一個故事了:
瀏覽器野史 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導出吧;