關於使用ajax導出excel問題
- 2020 年 3 月 14 日
- 筆記
最近有個需求是在頁面導入文件,後端進行處理後返回處理結果的excel,前端使用的是ajax。我最開始的做法是:在原有代碼後加一段導出excel的代碼,結果代碼能正常運行,但頁面始終沒有返回我需要的excel。
而後開始百度編程模式,得出以下結論:
ajax是無法直接導出excel的,因為ajax的返回值只能是字符流,而導出excel是後台往瀏覽器中寫入二進制的位元組流
導出excel有以下兩種方式:
方法一:window.location.href() & form表單.submit().
<a href="javascript:void(0)" onclick="exportExcel()">導出</a> // 導出,使用這種方式可以,使用ajax請求不可以導出excel function exportExcel(){ var form = $("<form>"); form.attr('style', 'display:none'); form.attr('target', ''); form.attr('method', 'post'); form.attr('action', '${pageContext.request.contextPath}/user/export'); var input1 = $('<input>'); input1.attr('type', 'hidden'); input1.attr('name', 'item'); input1.attr('value', 'test'); /* JSON.stringify($.serializeObject($('#searchForm'))) */ $('body').append(form); form.append(input1); form.submit(); form.remove(); }
function() { var stime = $("#layerdate").val(); var etime = $("#layerdate2").val(); window.location.href = "${pageContext.request.contextPath}/user/export?stime="+stime+"&etime="+etime; }
方法二:ajax請求把參數緩存在後端返回給前端,前端ajax再次發起一個window.open(url?params=params)即可
$.ajax({ url: '../../eldercare/excel/export?_' + $.now(), type: 'post', dataType: "json", contentType : 'application/json', data : JSON.stringify(this.tableOpts), success: function(data){ window.open('../../eldercare/excel/downFromCache?params='+data.rows, '_self'); },
注意,使用window.open()或是window.location.href()時有個前端傳值限制,超過限制數會報錯。
Microsoft Internet Explorer (Browser):IE瀏覽器對URL的最大限制為2083個字符,如果超過這個數字,提交按鈕沒有任何反應。 Firefox (Browser):對於Firefox瀏覽器URL的長度限制為65,536個字符 Safari (Browser):URL最大長度限制為 80,000個字符。 Opera (Browser):URL最大長度限制為190,000個字符。 Google (chrome):url最大長度限制為8182個字符