C#中通过com组件操作excel不能关闭的问题
2014-07-16 21:25
477 查看
问题:
当用如下代码操作完Excel,虽然调用了Application的Quit()方法,但发现Excel进程并没退出。
结果:
[align=left]原因:[/align]
When Visual Studio .NET calls a COM object from managed code, it automatically creates a Runtime Callable Wrapper (RCW). The RCW marshals calls between the .NET application and the COM object. The RCW keeps a reference count on the COM object.
Therefore, if all references have not been released on the RCW, the COM object does not quit.
[align=left]解决方案:[/align]
[align=left]1、为每一个对象定义一个变量。[/align]
[align=left]例如:[/align]
[align=left]把这段代码[/align]
[align=left]Workbook wb = wbs.Open(path, missing, true , missing, missing, missing, missing,[/align]
[align=left] missing, missing, true , missing, missing, missing, missing, missing);[/align]
改为
Workbooks wbs = app.Workbooks;
[align=left]Workbook wb = wbs.Open(path, missing, true , missing, missing, missing, missing,[/align]
[align=left] missing, missing, true , missing, missing, missing, missing, missing);[/align]
[align=left]2、当使用完com对象对其循环调用System.Runtime.InteropServices.Marshal.ReleaseComObject 直到返回值为0[/align]
[align=left]3、设置变量位null[/align]
[align=left]4、调用Quit方法通知服务器关闭[/align]
[align=left]5、调用GC .Collect();[/align]
[align=left]最终:[/align]
[align=left]把上边的代码修改为:[/align]
当用如下代码操作完Excel,虽然调用了Application的Quit()方法,但发现Excel进程并没退出。
object missing = System.Reflection.Missing .Value; Application app = new Application(); app.Visible = false ; app.UserControl = true ; Workbook wb = app.Workbooks.Open(path, missing, true , missing, missing, missing, missing, missing, missing, true , missing, missing, missing, missing, missing); Worksheet ws = (Worksheet )wb.Worksheets.get_Item(1); Console .WriteLine(ws.Cells[2,1].Value); ws.Close(); ws = null; app.Quit(); app = null;
结果:
[align=left]原因:[/align]
When Visual Studio .NET calls a COM object from managed code, it automatically creates a Runtime Callable Wrapper (RCW). The RCW marshals calls between the .NET application and the COM object. The RCW keeps a reference count on the COM object.
Therefore, if all references have not been released on the RCW, the COM object does not quit.
[align=left]解决方案:[/align]
[align=left]1、为每一个对象定义一个变量。[/align]
[align=left]例如:[/align]
[align=left]把这段代码[/align]
[align=left]Workbook wb = wbs.Open(path, missing, true , missing, missing, missing, missing,[/align]
[align=left] missing, missing, true , missing, missing, missing, missing, missing);[/align]
改为
Workbooks wbs = app.Workbooks;
[align=left]Workbook wb = wbs.Open(path, missing, true , missing, missing, missing, missing,[/align]
[align=left] missing, missing, true , missing, missing, missing, missing, missing);[/align]
[align=left]2、当使用完com对象对其循环调用System.Runtime.InteropServices.Marshal.ReleaseComObject 直到返回值为0[/align]
[align=left]3、设置变量位null[/align]
[align=left]4、调用Quit方法通知服务器关闭[/align]
[align=left]5、调用GC .Collect();[/align]
[align=left]最终:[/align]
[align=left]把上边的代码修改为:[/align]
public static void ExcelRead(string path) { object missing = System.Reflection.Missing.Value; Application app = new Application(); app.Visible = false; app.UserControl = true; Workbooks wbs = app.Workbooks; Workbook wb = wbs.Open(path, missing, true, missing, missing, missing, missing, missing, missing, true, missing, missing, missing, missing, missing); Sheets wss = wb.Worksheets; Worksheet ws = (Worksheet)wss.get_Item(1); Console.WriteLine(ws.Cells[2,1].Value); NAR(ws); ws = null; NAR(wss); wss = null; wb.Close(); NAR(wb); wb = null; wbs.Close(); NAR(wbs); wbs = null; app.Quit(); NAR(app); app = null; GC.Collect(); } private static void NAR(object o) { try { while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ; } catch { } finally { o = null; } }结果能正常关闭Excel进程。
相关文章推荐
- C#操作Excel时找不到“EXCEL9.OLB”com组件,可以通过如下方法实现:
- C# 导入excel数据,解决关闭excel后不能释放资源的问题
- C#操作Excel,调用ApplicationClass.Quit()关闭Excel时,发生异常:Microsoft Office Word 遇到问题需要关闭
- .NET1.1下,使用C#自动生成Word2003文档(通过操作COM组件实现)
- 在c#中将dataset输出成xml内容的xls文件,解决其它输出不能在excel中显示“001”的前导0的问题
- C#用Com组件解析Excel文件 然后删除Excel 并且彻底关闭Excel进程(公司实战项目经验)
- [原创]C#通过引用Office Excel (2007) 组件实现对Excel文件的操作
- C#通过引用Office Excel (2007) 组件实现对Excel文件的操作
- .NET1.1下,使用C#自动生成Word2003文档(通过操作COM组件实现)
- .NET1.1下,使用C#自动生成Word2003文档(通过操作COM组件实现)
- C#通过COM组件对WORD文档操作
- VB.NET 调用Excel 不能关闭 Excel.exe 进程的问题
- C# 操作excel 产生 .files 文件夹的问题
- C#通过引用Office Excel (2007) 组件实现对Excel文件的操作
- 有关于c#操作excel的问题 请各位大虾指教
- 使用C#自动生成Word2003文档(通过操作COM组件实现) [转]
- 通过vc 操作excel时避免重复定义的问题
- C#操作Excel,权限问题
- c#操作excel后关闭excel.exe的方法
- 关于Web程序打开Word、Excel后,不能关闭的问题的一个解决办法