[英]How to repair excel after ComObject Release in C#?
执行以下代码后:
Microsoft.Office.Interop.Excel.Application oXL;
oXL = new Microsoft.Office.Interop.Excel.Application();
oXL.Visible = false;
oXL.IgnoreRemoteRequests = true;
oXL.DisplayAlerts = false;
Workbook oWB;
oWB = oXL.Workbooks.Open(path, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Sheets excelSheets = oWB.Worksheets;
string currentSheet = "PC_HW_Info";
Worksheet excelWorksheet = excelSheets.get_Item(currentSheet);
string columnRange;
int rowsNumber = 2;
Range PC_User;
PC_User = excelWorksheet.get_Range("A2", "A2");
while ((PC_User.Value2) != null)
{
++rowsNumber;
columnRange = "A" + rowsNumber;
PC_User = excelWorksheet.get_Range(columnRange, columnRange);
}
PC_User.Value2 = "aaaa";
oXL.UserControl = false;
oWB.SaveAs("valid path to my file", XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing,
false, false, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
oWB.Close();
oXL.Quit();
Marshal.ReleaseComObject(oXL);
Marshal.ReleaseComObject(oWB);
Marshal.ReleaseComObject(excelSheets);
Marshal.ReleaseComObject(excelWorksheet);
我的Excel某种程度上已损坏,即使重新启动后,它也不会恢复其初始工作状态。 现在,我无法直接打开工作表,我必须使用“打开”->“浏览”来访问工作表。
在第一次运行时,当我打开已处理的原始文档的“已恢复”版本的工作表时,似乎已还原了该文件,但我又还原了它,但是从那时起,我无法像以前那样使用Excel。
有什么想法吗? 我在ReleaseComObject上做错了什么? 我应该如何关闭excel应用程序?
LE:如果我在关闭并释放对象的所有最后一行中添加注释,则说明它工作正常。
Microsoft.Office.Interop.Excel.Application oXL;
oXL = new Microsoft.Office.Interop.Excel.Application();
oXL.Visible = false;
oXL.IgnoreRemoteRequests = true;
oXL.DisplayAlerts = false;
Workbook oWB;
Workbooks wbs = oXL.Workbooks; //Never use two dots, since the middle one needs free as well
oWB = wbs.Open(path, 0, false, 5, "", "", false, XlPlatform.xlWindows, "", true, false, 0, true, false, false);
Marshal.ReleaseComObject(wbs);
Sheets excelSheets = oWB.Worksheets;
string currentSheet = "PC_HW_Info";
Worksheet excelWorksheet = excelSheets.get_Item(currentSheet);
string columnRange;
int rowsNumber = 2;
Range PC_User;
PC_User = excelWorksheet.get_Range("A2", "A2"); // Need to free
while ((PC_User.Value2) != null)
{
++rowsNumber;
columnRange = "A" + rowsNumber;
Marshal.ReleaseComObject(PC_User);
PC_User = excelWorksheet.get_Range(columnRange, columnRange);
}
PC_User.Value2 = "aaaa";
Marshal.ReleaseComObject(PC_User);
oXL.UserControl = false;
oWB.SaveAs("valid path to my file", XlFileFormat.xlWorkbookDefault, Type.Missing, Type.Missing,
false, false, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
oWB.Close();
Marshal.ReleaseComObject(excelWorksheet);
Marshal.ReleaseComObject(excelSheets);
Marshal.ReleaseComObject(oWB);
oXL.Quit();
Marshal.ReleaseComObject(oXL);
您忘记释放Range和工作簿对象。 您还犯了免费订购错误(尽管为了安全起见,我认为这不会产生影响)
通过不释放所有对象,您将在后台留下一个幽灵excel进程。 尝试杀死它们,看看是否能解决问题
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.