Ajax请求导出Excel的问题
參考:http://yuwenlin.iteye.com/blog/2275289
1.Ajax請(qǐng)求導(dǎo)出Excel的問(wèn)題描述:
前端發(fā)起Ajax請(qǐng)求get或post,后臺(tái)使用Poi生成excel文件,最后用response輸出excel文件流。整個(gè)調(diào)用過(guò)程都沒(méi)有報(bào)任何錯(cuò),excel文件也生成在本地,但瀏覽器沒(méi)有彈出文件下載,毫無(wú)反應(yīng)。
2.解決:
開(kāi)始一直以為是瀏覽器兼容性,或后臺(tái)輸出文件流代碼有問(wèn)題,調(diào)了半天,也都一樣,不報(bào)任何錯(cuò)。后來(lái)上網(wǎng)搜發(fā)現(xiàn)在類似的問(wèn)題,Ajax導(dǎo)出excel沒(méi)反應(yīng),網(wǎng)上有人說(shuō)不能使用ajax,換成地址重定向 window.location.href?就行,一換還真好使。
function() {var stime = $("#layerdate").val();var etime = $("#layerdate2").val();window.location.href = "${pageContext.request.contextPath}/user/export?stime="+stime+"&etime="+etime; }但是當(dāng)需要傳一個(gè)很大數(shù)據(jù)到后臺(tái)(window.location.href= actionUrl + "?" + data;),就會(huì)出問(wèn)題了,當(dāng)然,當(dāng)數(shù)據(jù)量不大的時(shí)候,使用這種方式是極好的。導(dǎo)致這個(gè)問(wèn)題的原因是各種瀏覽器對(duì)URL解析的長(zhǎng)度限制是不同的。
- Microsoft Internet Explorer (Browser):IE瀏覽器對(duì)URL的最大限制為2083個(gè)字符,如果超過(guò)這個(gè)數(shù)字,提交按鈕沒(méi)有任何反應(yīng)。
- Firefox (Browser):對(duì)于Firefox瀏覽器URL的長(zhǎng)度限制為65,536個(gè)字符
- Safari (Browser):URL最大長(zhǎng)度限制為 80,000個(gè)字符。
- Opera (Browser):URL最大長(zhǎng)度限制為190,000個(gè)字符。
- Google (chrome):url最大長(zhǎng)度限制為8182個(gè)字符
解決方法就換成了使用隱藏form來(lái)執(zhí)行導(dǎo)出操作,如下:
<a href="javascript:void(0)" onclick="exportExcel()">導(dǎo)出1</a>// 導(dǎo)出,使用這種方式 可以,使用 ajax請(qǐng)求不可以 導(dǎo)出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.總結(jié):
導(dǎo)出excel為什么不能用ajax請(qǐng)求?
因?yàn)閷?dǎo)出excel,實(shí)際上是文件下載,后臺(tái)需要往前端(瀏覽器)寫(xiě)文件流的。而Ajax請(qǐng)求獲取數(shù)據(jù)都是“字符串”,整個(gè)交互傳輸用的都是字符串?dāng)?shù)據(jù),它沒(méi)法解析后臺(tái)返回的文件流,但瀏覽器可以。
4.Ajax與Form表單提交的區(qū)別:
Ajax提交不會(huì)自動(dòng)刷新頁(yè)面,需要手動(dòng)處理。
Form表單提交在數(shù)據(jù)提交后會(huì)刷新頁(yè)面,如果是Post提交,點(diǎn)擊刷新瀏覽器會(huì)提示 是否再次提交。
?
總結(jié)
以上是生活随笔為你收集整理的Ajax请求导出Excel的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 6.虚拟机类加载机制
- 下一篇: 2017年本博客知识体系引导(更新至20