我认为之所以出现进程占用的的错误,是因为当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();
再进行下载,就可以了。
浙公网安备 33010602011771号