asp.net 使用npoi导出excel后,刷新界面,一直无法解决,求大神指点
asp.net 使用npoi导出excel后,刷新界面,一直无法解决,求大神指导
使用npoi 导出excel代码:
var mStream = Excel.GetUtil(filename).GetStream(ds.Tables[0]);
MemoryStream ms = mStream as MemoryStream;
Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
System.IO.File.WriteAllBytes(HttpRuntime.AppDomainAppPath + "\\uploadfile\\" + filename, ms.GetBuffer());
var util = Excel.GetUtil(filename);
Response.BinaryWrite(ms.ToArray());
点击导出excel按钮后,弹出防止多次点击的div,但是当excel导出完成后,div无法消失,也就是在导出excel后的语句无法执行,有没有人遇到过这种情况,求解啊。。。。。
------解决思路----------------------
为什么要弹出防止多次点击的div?
点击了,页面会先刷新,然后弹出下载对话框,点了是之后,就下载文件了
人家想再下载一次,就再点呗,为什么不让点
------解决思路----------------------
我认为楼主做的不错啊,点了之后要加载一会吧?客户等不及了多点几次,不就卡死了?可惜不知道怎么解决
------解决思路----------------------
点了后暂时让那个按钮处于不可用状态不就可以了
------解决思路----------------------
“导出页面”应该在一个弹出页面导出,原始的页面不应该刷新,而是在原始页面(单页javascript程序)上自动改变按钮的状态。
------解决思路----------------------
由于HTTP的无状态协议,提交过去以后后台就不知道前台的状态,后台返回后,又是各干各的。你是无法知道用户什么时候开始下载的。并且由于返回的不是text/html,而是二进制,因此你的浏览器也不知道是不是已经下载完成。因此只有假借一下Session(当然,这个并不是一个很好的方案,仅只是一个后台的假设),然后前端用心跳去不停地判断状态,当点击下载,前端遮住,后台执行,当后台准备完毕,前端也获取到状态了,因此就可以去除遮罩了。如附件所示:
http://download.****.net/detail/jjkk168/8671123
------解决思路----------------------
“也就是在导出excel后的语句无法执行”这里根本没有此类代码,导出excel的语句根本就是在另外一个页面上的。而弹出的div也无需等待什么导出完毕,只要保证5秒钟内不能重复按下去就足矣了。实际上就算是允许重复按下去,你的后台也可以判断用户是否是连续按了。实际上就算是你的后台也懒得去判断,那么打开另一个下载页面把刚刚“缓存的内容”重新下载也挺好,因为过呢本不需要重新产生excel。
------解决思路----------------------
几乎所有的浏览器,当它打开一个(消息头中)标明有下载关键字段的网页时,当下载完毕都会自动自动关闭页面。如果你的客户端 javascript 程序去打开另一个页面,那么这个 open 函数返回的页面是可以被你的 javascript 查询其“是否还存在”的状态的,也可以捕获其unload 事件的,是完全可以知道何时下载完毕的。
关键是,没有必要搞这种监听。用户如果等5秒钟之后再次点下载按钮,你就可以给他在从上次输出 excel 创建的缓存中,再次下载一份。这用不着修改3、4行代码,而可以提供功能。何乐而不为?
使用npoi 导出excel代码:
var mStream = Excel.GetUtil(filename).GetStream(ds.Tables[0]);
MemoryStream ms = mStream as MemoryStream;
Response.ContentType = "application/vnd.ms-excel";
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
Response.AddHeader("Content-Length", ms.ToArray().Length.ToString());
System.IO.File.WriteAllBytes(HttpRuntime.AppDomainAppPath + "\\uploadfile\\" + filename, ms.GetBuffer());
var util = Excel.GetUtil(filename);
Response.BinaryWrite(ms.ToArray());
点击导出excel按钮后,弹出防止多次点击的div,但是当excel导出完成后,div无法消失,也就是在导出excel后的语句无法执行,有没有人遇到过这种情况,求解啊。。。。。
------解决思路----------------------
为什么要弹出防止多次点击的div?
点击了,页面会先刷新,然后弹出下载对话框,点了是之后,就下载文件了
人家想再下载一次,就再点呗,为什么不让点
------解决思路----------------------
我认为楼主做的不错啊,点了之后要加载一会吧?客户等不及了多点几次,不就卡死了?可惜不知道怎么解决
------解决思路----------------------
点了后暂时让那个按钮处于不可用状态不就可以了
------解决思路----------------------
“导出页面”应该在一个弹出页面导出,原始的页面不应该刷新,而是在原始页面(单页javascript程序)上自动改变按钮的状态。
------解决思路----------------------
由于HTTP的无状态协议,提交过去以后后台就不知道前台的状态,后台返回后,又是各干各的。你是无法知道用户什么时候开始下载的。并且由于返回的不是text/html,而是二进制,因此你的浏览器也不知道是不是已经下载完成。因此只有假借一下Session(当然,这个并不是一个很好的方案,仅只是一个后台的假设),然后前端用心跳去不停地判断状态,当点击下载,前端遮住,后台执行,当后台准备完毕,前端也获取到状态了,因此就可以去除遮罩了。如附件所示:
http://download.****.net/detail/jjkk168/8671123
------解决思路----------------------
“也就是在导出excel后的语句无法执行”这里根本没有此类代码,导出excel的语句根本就是在另外一个页面上的。而弹出的div也无需等待什么导出完毕,只要保证5秒钟内不能重复按下去就足矣了。实际上就算是允许重复按下去,你的后台也可以判断用户是否是连续按了。实际上就算是你的后台也懒得去判断,那么打开另一个下载页面把刚刚“缓存的内容”重新下载也挺好,因为过呢本不需要重新产生excel。
------解决思路----------------------
几乎所有的浏览器,当它打开一个(消息头中)标明有下载关键字段的网页时,当下载完毕都会自动自动关闭页面。如果你的客户端 javascript 程序去打开另一个页面,那么这个 open 函数返回的页面是可以被你的 javascript 查询其“是否还存在”的状态的,也可以捕获其unload 事件的,是完全可以知道何时下载完毕的。
关键是,没有必要搞这种监听。用户如果等5秒钟之后再次点下载按钮,你就可以给他在从上次输出 excel 创建的缓存中,再次下载一份。这用不着修改3、4行代码,而可以提供功能。何乐而不为?