若是在頁面上展現了一個數據表格,而用戶想把這個表格導出爲Excel文件,那麼在要求不高的狀況下,能夠不經過服務器生成表格,而是直接利用JavaScript的Blob和Object URL特性將表格導出。不過,醜話說在前頭,這篇隨筆中利用了Excel能打開HTML文檔的特性,因此導出的表格其實是一個HTML文檔,而且其擴展名只能爲.xls,而不能是.xlsx,不然Excel沒法打開。(不過確實見過使用JavaScript生成真正Excel文件的方案,這裏暫不說起。)html
實現代碼以下,包含HTML頁面和JavaScript腳本:數組
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <meta charset="utf-8" /> <style> /* 此樣式僅用於瀏覽器頁面效果,Excel不會分離表格邊框,不須要此樣式 */ table { border-collapse: collapse; } </style> </head> <body> <!-- 設置border="1"以顯示錶格框線 --> <table border="1"> <!-- caption元素能夠生成表標題,其單元格列跨度爲表格的列數 --> <caption>學生成績表</caption> <tr> <!-- 可使用rowspan和colspan來合併單元格 --> <th rowspan="2">編號</th> <th rowspan="2">學號</th> <th rowspan="2">姓名</th> <th rowspan="2">性別</th> <th rowspan="2">年齡</th> <th colspan="3">成績</th> </tr> <tr> <th>語文</th> <th>數學</th> <th>英語</th> </tr> <tr> <td>1</td> <td>2016001</td> <td>張三</td> <td>男</td> <td>13</td> <td>85</td> <td>94</td> <td>77</td> </tr> <tr> <td>2</td> <td>2016002</td> <td>李四</td> <td>女</td> <td>12</td> <td>96</td> <td>84</td> <td>89</td> </tr> </table> <a>導出表格</a> <script> // 使用outerHTML屬性獲取整個table元素的HTML代碼(包括<table>標籤),而後包裝成一個完整的HTML文檔,設置charset爲urf-8以防止中文亂碼 var html = "<html><head><meta charset='utf-8' /></head><body>" + document.getElementsByTagName("table")[0].outerHTML + "</body></html>"; // 實例化一個Blob對象,其構造函數的第一個參數是包含文件內容的數組,第二個參數是包含文件類型屬性的對象 var blob = new Blob([html], { type: "application/vnd.ms-excel" }); var a = document.getElementsByTagName("a")[0]; // 利用URL.createObjectURL()方法爲a元素生成blob URL a.href = URL.createObjectURL(blob); // 設置文件名 a.download = "學生成績表.xls"; </script> </body> </html>
效果如圖:瀏覽器
打開下載的文件:服務器
使用開發者工具檢查a元素,就能大體明白blob URL的工做原理:app
<a href="blob:http://localhost:52347/0ead79dc-1896-4a53-b1f1-dfbafff4e953" download="學生成績表.xls">導出表格</a>
若是想經過按鈕導出文件,能夠在按鈕的點擊事件中建立a元素,配置其屬性並觸發其點擊事件。不過在FireFox中,須要先將建立的a元素放入body中,不然沒法下載。函數