在C#中挂起Excel过程

我有一个C#程序,打开Excel文件,读取单元格,closures文件,并退出Excel。 不幸的是,Windows任务pipe理器仍然显示Excel.exe进程正在运行。 我读过几乎所有关于这个问题的文章,并尝试了几乎所有的解决scheme。 。 。 仍然有同样的问题。 我相信其中一个COM对象没有被释放,从而挂起了这个过程。 不过,我也相信我一直非常小心实例化Excel对象(不加双“。”)并释放它们。

如果我删除了“a = xlCells [1,1] .Value”行,则每个事情都会释放,并且Excel会在应用程序实例的FinalReleaseComObject之后干净地死亡。 为什么这个任务会创buildCOM对象或者干扰它们?

Excel.Application xlApp = null; Excel.Workbooks xlWorkbooks = null; Excel.Workbook xlWorkbook = null; Excel.Sheets xlSheets = null; Excel.Worksheet xlWorksheet = null; Excel.Range xlCells = null; string inputFile = @"C:\Temp\test.xlsx"; string a; xlApp = new Excel.Application(); xlApp.Visible = false; xlApp.DisplayAlerts = false; xlWorkbooks = xlApp.Workbooks; xlWorkbook = xlWorkbooks.Open(inputFile); xlSheets = xlWorkbook.Sheets; xlWorksheet = xlSheets[1]; xlCells = xlWorksheet.Cells; a = xlCells[1,1].Value; Marshal.FinalReleaseComObject(xlCells); xlCells = null; Marshal.FinalReleaseComObject(xlWorksheet); xlWorksheet = null; Marshal.FinalReleaseComObject(xlSheets); xlSheets = null; xlWorkbook.Close(false, Type.Missing, Type.Missing); Marshal.FinalReleaseComObject(xlWorkbook); xlWorkbook = null; xlWorkbooks.Close(); Marshal.FinalReleaseComObject(xlWorkbooks); xlWorkbooks = null; xlApp.Quit(); Marshal.FinalReleaseComObject(xlApp); xlApp = null; 

我会做两个改变。 首先,由于Sheets项目可以是工作表或图表,所以最好使用As并检查是否为null 。 其次,如果你只想得到一个带有字母数字地址的范围,那么get_Range()方法就行得通。 否则,如果您想按行列索引进行操作,请遵循@ Daneau的评论。

 xlWorksheet = xlSheets[1] as Excel.Worksheet; if(xlWorksheet != null) { xlCells = xlWorksheet.get_Range("A1"); a = xlCells[1,1].Value; Marshal.FinalReleaseComObject(xlCells); xlCells = null; Marshal.FinalReleaseComObject(xlWorksheet); xlWorksheet = null; } 

我改变了代码,并添加了虚拟的Range对象。

 Range tmpCell = xlCell[1,1]; a = tmpCell.Value; Marshal.ReleaseComObject(tmpCell); 

我的问题消失了。 非常感谢Daneau!

真正的例程有几个循环与评估单元格。 我认为这将工作正常使用tmpCell为每个新的单元格分配,然后释放tmpCell在最后。 那失败了。 在每个新的tmpCell分配给xlCell [x,y]之前,我必须释放tmpCell。 这工作,但肯定是累赘的。 很难相信没有更好的方法来pipe理这个或跟踪各种COM对象。