为什么这行代码导致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");