Response.WriteFile导出excel 文件正由另一进程使用

Posted on 2009-05-18 22:26  ymss  阅读(1436)  评论(2)    收藏  举报

我认为之所以出现进程占用的的错误,是因为当excel 写入的内容较多时,操作系统(WINDOWS2000)关闭excel 进程时间要长一些,而.NET下载代码运行很快,马上会要求读取excel 的文档,这时操作系统尚未处理完excel 的进程,因此excel 文档处于收保护状态,因此造成.NET进程和excel 进程的冲突。  
          实验中,单独执行excel 写入很成功,不会留下excel 进程,写入和下载连续进行就会出错,并留下excel 进程,运行几次,就会留下几个excel 进程,这印证了我上面的一些想法。  
  至于copine()   的方法可行,是因为ASP.NET第一次的运行很慢(转到其他页面相当于其他页面的第一次运行),这就给操作系统足够的时间关闭excel 进程,所以会成功,失败则是导入excel 的数据太多,致使操作系统关闭excel 进程的时间大于其他页面的第一次运行的时间。  
          综上所述,excel 写和下载存在冲突的可能,根本原因是excel 进程和ASP进程相互独立,单独依靠操作系统不能作到两个进程的互斥。  
所以我们用完excel 进程后就要结束

 Excel.Application excel = new Excel.ApplicationClass();
            int rowindex = 1;
            int colindex = 0;
            Excel.Workbook work = excel.Workbooks.Add(true);

..........

结束excel 进程代码

 excel.DisplayAlerts = false;
            work.Close(false, null, false);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(work);
            work = null;
            excel.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
            excel = null;              
            GC.Collect();

再进行下载,就可以了。

 

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3