【发布时间】:2011-06-25 06:43:09
【问题描述】:
为什么这行代码会导致 Excel 不退出?
Excel.Range range = (Excel.Range)ws.Cells[1,1];
如果是因为强制转换,那么这段代码不会导致同样的问题吗?
Excel.Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
我试过了。但这有效。 Excel 将关闭。
如果我使用此代码。 Excel 关闭。
Excel.Range range = ws.get_Range("A1","A1");
那么有什么区别呢?是的,我知道有一百万个“如何正确关闭 Excel”线程。但由于这是一个问题而不是答案,我决定问一个新问题而不是问其他人的问题。
这是我的代码。但当然还有其他代码。我只是注释掉所有内容并慢慢尝试哪些行导致 Excel 无法关闭。我意识到即使不使用垃圾收集器,Excel 仍然会关闭。我不想用大锤来关闭 Excel。
谢谢。
Excel.Application objExcel = new Excel.Application();
Excel.Workbooks wbs = objExcel.Workbooks;
Excel.Workbook wb = wbs.Open(saveFileDialog1.FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Excel.Worksheet ws = (Excel.Worksheet)wb.ActiveSheet;
//Excel.Range range = (Excel.Range)ws.Cells[1,1];
Excel.Range range = ws.get_Range("A1","A1");
FinalReleaseAnyComObject(range);
FinalReleaseAnyComObject(ws);
wb.Close(Type.Missing, Type.Missing, Type.Missing);
FinalReleaseAnyComObject(wb);
FinalReleaseAnyComObject(wbs);
objExcel.Quit();
FinalReleaseAnyComObject(objExcel);
目前我已经尝试过 objExcel、wbs、wb 和 ws。这 4 个对象不会造成问题。
private static void FinalReleaseAnyComObject(object o)
{
Marshal.FinalReleaseComObject(o);
o = null;
}
我知道你也不能重用这个变量。
Excel.Range range = ws.get_Range("A1","G1");
range = ws.get_Range("A1", "A1");
这也会导致 Excel 无法正常关闭。而是使用它。
Excel.Range range = ws.get_Range("A1","G1");
FinalReleaseAnyComObject(range);
range = ws.get_Range("A1", "A1");
【问题讨论】:
-
@user:关闭,你的意思是崩溃吗?看来强制转换操作不应该刻意关闭Excel。
-
@p.campbell 关闭,我的意思是正确关闭 Excel。 Excel 或 COM 对象可能存在无法正确关闭的众所周知的问题。即即使在我调用 objExcel.quit() 之后,Excel 进程仍将保留在任务管理器中。