參考:https://www.cnblogs.com/xbq8080/p/7344258.htmljavascript
1.Ajax請求導出Excel的問題描述:html
前端發起Ajax請求get或post,後臺使用Poi生成excel文件,最後用response輸出excel文件流。整個調用過程都沒有報任何錯,excel文件也生成在本地,但瀏覽器沒有彈出文件下載,毫無反應。前端
2.解決:java
開始一直覺得是瀏覽器兼容性,或後臺輸出文件流代碼有問題,調了半天,也都同樣,不報任何錯。後來上網搜發如今相似的問題,Ajax導出excel沒反應,網上有人說不能使用ajax,換成地址重定向 window.location.href 就行,一換還真好使。ajax
function() { var stime = $("#layerdate").val(); var etime = $("#layerdate2").val(); window.location.href = "${pageContext.request.contextPath}/user/export?stime="+stime+"&etime="+etime; }
可是當須要傳一個很大數據到後臺(window.location.href= actionUrl + "?" + data;),就會出問題了,固然,當數據量不大的時候,使用這種方式是極好的。致使這個問題的緣由是各類瀏覽器對URL解析的長度限制是不一樣的。chrome
解決方法就換成了使用隱藏form來執行導出操做,以下:瀏覽器
<a href="javascript:void(0)" onclick="exportExcel()">導出1</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(); }
3.總結:app
導出excel爲何不能用ajax請求?post
由於導出excel,其實是文件下載,後臺須要往前端(瀏覽器)寫文件流的。而Ajax請求獲取數據都是「字符串」,整個交互傳輸用的都是字符串數據,它無法解析後臺返回的文件流,但瀏覽器能夠。大數據
4.Ajax與Form表單提交的區別:
Ajax提交不會自動刷新頁面,須要手動處理。
Form表單提交在數據提交後會刷新頁面,若是是Post提交,點擊刷新瀏覽器會提示 是否再次提交。