前端若想下載一個根據查詢參數生成的excel報表文件,須要後端設置請求內容的類型,具體設置以下:html
response.reset(); response.setContentType("application/vnd.ms-excel;charset=utf-8"); // 代表是excel類型 //response.setContentType("application/octet-stream"); // 或設成通用二進制流類型 response.setHeader("Content-Disposition", "attachment;filename=test.xls")); // 將請求的內容存爲一個名爲test的文件
正常狀況下,用如下兩種方法都可:前端
window.open('/url/download?param=xxx') window.location = '/url/download?param=xxx' // 不加href,是由於有些瀏覽器有兼容問題
但若是window.open是在一個ajax回調裏執行,瀏覽器會被安全攔截,解決方案:java
$.ajax({ .... success: function() { var win = window.open() win.location = '/url/download?param=xxx' } })
或直接用window.locationajax
$.ajax({ .... success: function() { window.location = '/url/download?param=xxx' } })
具體完整代碼以下:json
<button onclick='tableToExcel()'>json導出xls文件</button> <script> function tableToExcel() { var jsonData = [{ name: '路人甲', phone: '123456', email: '123@123456.com' }, { name: '炮灰乙', phone: '123456', email: '123@123456.com' }] //列標題 var table = '<tr><td>姓名</td><td>電話</td><td>郵箱</td></tr>' //循環遍歷,每行加入tr標籤,每一個單元格加td標籤 jsonData.forEach(function(item) { table += '<tr>'; for (let key in item) { //增長\t爲了避免讓表格顯示科學計數法或者其餘格式 table += `<td>${item[key] + '\t'}</td>` } table += '</tr>'; }) //Worksheet名 var worksheet = 'Sheet1' //下載的表格模板數據 var 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> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <!--[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>` // 下載模板 window.location.href = 'data:application/vnd.ms-excel;base64,' + base64(template) } //輸出base64編碼 function base64(s) { return window.btoa(unescape(encodeURIComponent(s))) } </script>