在前端開發過程中,導出列表功能的開發無非兩種,一種是有后台生成,發生給前端下載,第二種是前端進行列表的導出工作。之前接觸了一種前端導出列表的插件 tableExport.js ,但是其缺點很明顯,需要將需要導出的列表通過table表格的標准形式渲染到頁面中,才能夠導出。當數據量大的時候,瀏覽器渲染大量數據到頁面中,很容易出現卡頓 甚至是崩潰。為了導出大量數據,查找測試了一些其他的列表導出插件,最后發現js-xlsx 比較出眾。
js-xlsx 無需將數據渲染到頁面中,他是通過流轉換的形式來導出列表。其導出格式包括了xlsx、ods、xlsb、fods、xls等等,較為豐富。使用方法較為簡單,可以將其封裝成公共的方法,在需要的地方調用即可。
1 /** 2 * 導出列表方法 3 * @param {*} data 需要導出的數據 數組形式 [[表頭],[數據1],[數據2]...] 4 * @param {*} fileName 下載的文件名稱 5 * @param {*} titleName 表格標題 6 * @param {*} type 7 */ 8 function downloadExl(data, fileName,titleName,type) { 9 const self = this; 10 const range = data[0].length - 1; 11 const wopts = { bookType: 'xlsx', bookSST: false, type: 'binary' }; 12 const wb = { SheetNames: ['Sheet1'], Sheets: {}, Props: {} }; 13 data = XLSX.utils.json_to_sheet(data); 14 data["A1"] = { t: "s", v: titleName}; //設置表格標題 15 data["!merges"] = [{//合並第一行數據[B1,C1,D1,E1] 16 s: {//s為開始 17 c: 0,//開始列 18 r: 0,//開始取值范圍 19 alignment: {horizontal: "center" ,vertical: "center"} 20 }, 21 e: {//e結束 22 c: range,//結束列 23 r: 0//結束范圍 24 } 25 }]; 26 wb.Sheets['Sheet1'] = data; 27 self.saveAs(new Blob([this.s2ab(XLSX.write(wb, wopts))], { type: "application/octet-stream" }), fileName + '.' + (wopts.bookType=="biff2"?"xls":wopts.bookType)); 28 };
1 /** 2 * 導出列表方法 數據轉換 3 * @param {*} s 4 */ 5 exports.s2ab = function(s) { 6 if (typeof ArrayBuffer !== 'undefined') { 7 var buf = new ArrayBuffer(s.length); 8 var view = new Uint8Array(buf); 9 for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; 10 return buf; 11 } else { 12 var buf = new Array(s.length); 13 for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF; 14 return buf; 15 } 16 };
/** * 導出列表方法,下載文件 */ exports.saveAs = function(obj, fileName) {//當然可以自定義簡單的下載文件實現方式 var tmpa = document.createElement("a"); tmpa.download = fileName || "下載"; tmpa.href = URL.createObjectURL(obj); //綁定a標簽 tmpa.click(); //模擬點擊實現下載 setTimeout(function () { //延時釋放 URL.revokeObjectURL(obj); //用URL.revokeObjectURL()來釋放這個object URL }, 100); };
