首页 新闻 会员 周边 捐助

.net导出EXCEL,数据较多时碰到问题

0
悬赏园豆:20 [已解决问题] 解决于 2013-07-01 11:44

//excel工具类       

ExcelManage exmanage = new ExcelManage(phypath, true);
//导出datatable 到excle,保存取phypath       

exmanage.OutputToExcelSheet(ds.Tables[0], phypath);

//下载该文件

downloadExcel(phypath);

下载和导出EXCEL和下载的方法都没有问题

 

导出小数据50条,可以正常下载。

但2000条数据,则报如下错。

文件“E:**.xls”正由另一进程使用,因此该进程无法访问该文件。

说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.IO.IOException: 文件“E:\BFDistanceEducation\DistanceEducationWeb\temp\2013-5-1715-41-58.xls”正由另一进程使用,因此该进程无法访问该文件。

源错误:

行 300:        contextResponse.ContentEncoding = System.Text.Encoding.UTF8;
行 301:        contextResponse.ContentType = "application/ms-excel";//设置输出文件类型为excel文件。 
行 302:        contextResponse.WriteFile(fi.FullName);

 

在downloadExcel 前写个长时间的sleep,就不报错了。

我猜测的错误原因。

因为关联的表比较多,可能这个查询和导出比较耗时。

try
                {
                    if (objConn.State == ConnectionState.Open)
                    {

                        objConn.Close();
                    }
                }
                catch (Exception exp)
                {
                    throw exp;
                }
                finally {
                    objConn.Dispose();
                }
View Code

exmanage.OutputToExcelSheet(ds.Tables[0], phypath); 这个操作EXCLE文件的方法还未执行完。EXCEL还在占用中

(方法里,有close和dispose)

就直接进下载

downloadExcel(phypath);

下载时,文件还没有释放。

 

我一直以为是顺序操作的,一定是先导出,执行完毕再下载。

但除了这种原因,实在想不出别的了。

(也可能是,和EXCEL的连接是关闭了,但关闭连接时,EXCEL是要保存为本地文件的,会不会是可能是保存的过程中,就进了下载方法?)

有没有判断的方法?直接无脑SLEEP太低级了。下1条也sleep……

cclient的主页 cclient | 菜鸟二级 | 园豆:264
提问于:2013-05-17 15:53
< >
分享
最佳答案
0

等写完了你再下载啊 下载前先判断一下文件是否占用不就行了

收获园豆:10
二十三号同学 | 小虾三级 |园豆:974 | 2013-05-18 12:19
其他回答(3)
0

刚刚写了篇关于Excel导出的文章,可以去主页看看。倒是推荐把Excel写到MemoryStream里,再CopyTo()方法写入Response。

Jusfr | 园豆:209 (菜鸟二级) | 2013-05-17 16:14
0

流的方式来处理吧

收获园豆:10
twistting | 园豆:575 (小虾三级) | 2013-05-17 16:45
0
@@@一统@@@ | 园豆:1551 (小虾三级) | 2013-05-19 10:05
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册