//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(); }
exmanage.OutputToExcelSheet(ds.Tables[0], phypath); 这个操作EXCLE文件的方法还未执行完。EXCEL还在占用中
(方法里,有close和dispose)
就直接进下载
downloadExcel(phypath);
下载时,文件还没有释放。
我一直以为是顺序操作的,一定是先导出,执行完毕再下载。
但除了这种原因,实在想不出别的了。
(也可能是,和EXCEL的连接是关闭了,但关闭连接时,EXCEL是要保存为本地文件的,会不会是可能是保存的过程中,就进了下载方法?)
有没有判断的方法?直接无脑SLEEP太低级了。下1条也sleep……
等写完了你再下载啊 下载前先判断一下文件是否占用不就行了
刚刚写了篇关于Excel导出的文章,可以去主页看看。倒是推荐把Excel写到MemoryStream里,再CopyTo()方法写入Response。
流的方式来处理吧