首页 新闻 赞助 找找看

SQL Server导出数据到Excel(300万条数据)

0
悬赏园豆:5 [已解决问题] 解决于 2018-02-12 11:39

这是个Web项目(MVC+EF+SQL Server),需求如题。

我用的EF把300万条数据读取到DataTable中,然后用NPOI写入到Excel文件,通过Return File("Excel的路径")返回到前台,让浏览器把这个Excel下载到本地。

现在有1个问题:

  查询数据+写入到Excel的时间约50秒,这一段时间前台一直会卡着不动。

我的解决方案是:

  1.写个Ajax请求,用于查询和生成Excel。这一步不返回值。

  2.同时在创建一个Ajax请求,这个请求会每2秒执行一次,用于判断Excel是否生成完毕。

  3.如果Excel生成完毕,则显示一个“下载”按钮,来下载这个Excel

 

这样做确实解决了页面卡死,但是没隔2秒就发一次请求,太浪费资源。对于这种把数据库数据导出的情况,一般都有什么解决方案,请大神赐教!!!

Mad_Rabbit的主页 Mad_Rabbit | 菜鸟二级 | 园豆:307
提问于:2018-02-11 16:48
< >
分享
最佳答案
0

websocket与客户单建立长连接。服务器生成完EXCEL后通知客户端。如果讲究用户体验,可以实时读取生成进度,显示到页面上,这样更加友好。websocket的出现,就是解决AJAX轮询这种传统方式,以不断访问服务器,来获取实时消息的资源浪费的优化方案。但是,目前支持的浏览器有限,你可以根据实际情况,决定是否运用websocket新方式.

收获园豆:5
潇潇@暮雨 | 菜鸟二级 |园豆:256 | 2018-02-12 11:17

好的,多谢多谢!!!

Mad_Rabbit | 园豆:307 (菜鸟二级) | 2018-02-12 11:37
其他回答(1)
0

我的问题是,你从哪里听说的“太浪费资源”?

这种需求,如果仔细分析的话,可以变成下载很快的。

解决方案有两种

1、点击时,生成,耗时很长,等待完成,至于如何等待,如何通知客户端完成。这是第二个话题。

2、预先生成,点击时立即下载。

 

你说的AJAX轮询是一种方法,

另一种方法是无法是建立一个长连接,服务端完成时通知客户端,无非看起来更加优雅一些。

还有一种方法是完成时发一封邮件给用户,用户点击链接下载。

爱编程的大叔 | 园豆:30839 (高人七级) | 2018-02-11 20:57

嗯。

我不满意的是,ajax每2秒就查询一次,服务器来每次都得做出响应,这会增加服务器的压力。

支持(0) 反对(0) Mad_Rabbit | 园豆:307 (菜鸟二级) | 2018-02-11 21:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册