`
足至迹留
  • 浏览: 485786 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

struts2下载excel文件

阅读更多
1. 问题描述
最近在做一个小程序,要求能把查询记录导成excel并供前端下载。
1).导出excel功能使用jxl实现(当然也可以使用功能更强的poi,但小巧的jxl性能更好些)。
2).下载功能却遇到点小问题。
struts配置:
<action name="download" class="com.harmonywisdom.emergency.smsplatform.action.DownloadAction">
			<result name="success" type="stream">
				<!--设置为excel类型 -->
				<param name="contentType">application/vnd.ms-excel;charset=ISO8859-1</param>
				
				<!--下载文件流 -->
				<param name="inputName">inputStream</param>

				<!--添加参数,即就是下载的名称 -->
				<param name="contentDisposition">attachment;filename="${fileName}"</param>

				<!--缓存 -->
				<param name="bufferSize">4096</param>
			</result>
		</action>

这里的几个参数都很重要,首先是result的类型是stream, 其次contentType指明excel,接着是action要有getInputStream()方法,下面就是contentDisposition必须有attachment属性,代表是作为附件下载而不是直接打开。filename就是传给action的文件名,通过getInputStream()返回该文件的流。一切都没有问题。

ajax请求
前端页面采用的ajax请求下载,遇到了麻烦,无论get还是post都不行,就是弹不出保存文件对话框,如果浏览器收到了文件流就会自动弹出保存框。这说明浏览器确实没有收到流,F12查看下ajax请求,果然,成功收到了响应,但响应内容都是字符串。呀,ajax接收的内容本来就都会转成字符串(xml或text)的。所以不能采用ajax来请求下载。

2. 解决
很明确,把ajax改成下面即可:
location.href="/app/sms/download.action?fileName=" + data;


或者其他解决办法,比如设置一个<a>标签,href请求action。总之要保证浏览器收到的是流,而不是字符串。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics