C# 如何释放Excel对象
在下面的代码中,我有一个注释掉的foreach循环,它可以工作,但由于后台枚举,它不会释放excel对象。所以我尝试将它转换为for循环,但直到现在我已经避免了for循环,我似乎无法让我的循环工作。我只是指出我知道它坏了 我确实注释掉了坏掉的“for”循环,它运行起来,所有的工作都按照预期进行,除了我不能释放excel对象。。。 我的问题是,我已经尝试了很多不同的例子,但是我不能从我的任务管理器中释放excel对象,它在后台仍然是开放的 我使用一点法则 我用的是试一试/决赛 我已经尝试了许多不同的Marshal.ReleaseComOjbectobj,这些都是来自web的示例 我使用的是“for循环”而不是foreach循环,因此没有隐藏的枚举对象 谢谢你的帮助,教育 我的代码:C# 如何释放Excel对象,c#,excel,for-loop,foreach,marshalling,C#,Excel,For Loop,Foreach,Marshalling,在下面的代码中,我有一个注释掉的foreach循环,它可以工作,但由于后台枚举,它不会释放excel对象。所以我尝试将它转换为for循环,但直到现在我已经避免了for循环,我似乎无法让我的循环工作。我只是指出我知道它坏了 我确实注释掉了坏掉的“for”循环,它运行起来,所有的工作都按照预期进行,除了我不能释放excel对象。。。 我的问题是,我已经尝试了很多不同的例子,但是我不能从我的任务管理器中释放excel对象,它在后台仍然是开放的 我使用一点法则 我用的是试一试/决赛 我已经尝试了许多不同
public static List<ExcelObject> listOfExcelObjects = new List<ExcelObject>();
public static void txtSearchBar_Changed(object sender, EventArgs e)
{
Excel.Application excel = null;
Excel.Workbooks workbooks = null;
Excel.Workbook workbook = null;
Excel.Sheets sheets = null;
Excel.Worksheet worksheet = null;
Excel.Range range = null;
try
{
excel = new Excel.Application();
workbooks = excel.Workbooks;
workbook = workbooks.Open(GlobalObject.filePath, Notify: false, ReadOnly: true);
sheets = workbook.Sheets;
for (int i = 1; i < sheets.Count; i++)
{
worksheet = sheets.Item[i];
if (worksheet.Visible == Excel.XlSheetVisibility.xlSheetVisible)
{
Form_MainForm.thisForm.cmbx_WorkSheet.Items.Add(sheets.Item[i].Name);
if (worksheet.Name == "UNIT FEEDER")
{
Form_MainForm.thisForm.cmbx_WorkSheet.Text = worksheet.Name;
worksheet.Select();
Form_MainForm.thisForm.txtBox_StartingRow.Text = $"11";
Form_MainForm.thisForm.txtBox_EndingRow.Text = $"{_Events.EndOfRow()}";
range = worksheet.Range[$"A{Int32.Parse(Form_MainForm.thisForm.txtBox_StartingRow.Text)}", $"A{Int32.Parse(_Events.EndOfRow())}"];
for (int j = 1; j < range.Cells.Count; j++)
{
_Events.listOfExcelObjects.Add(new ExcelObject() { FeederNumber = range.Cells.Item[j] });
}
//foreach (Excel.Range j in worksheet.Range[$"A{Form_MainForm.thisForm.txtBox_StartingRow.Text}", $"A{_Events.EndOfRow()}"].Cells)
//{
// _Events.listOfExcelObjects.Add(new ExcelObject() { FeederNumber = j.Value });
//}
Form_MainForm.thisForm.grd_DataGridView.DataSource = _Events.listOfExcelObjects;
}
}
}
}
finally
{
releaseObject(range);
releaseObject(worksheet);
releaseObject(sheets);
releaseObject(workbook);
releaseObject(workbooks);
releaseObject(excel);
//Marshal.ReleaseComObject(range);
//Marshal.ReleaseComObject(worksheet);
//Marshal.ReleaseComObject(sheets);
//Marshal.ReleaseComObject(workbook);
//Marshal.ReleaseComObject(workbooks);
//Marshal.ReleaseComObject(excel);
}
}
private static void releaseObject(object obj)
{
if (obj != null && Marshal.IsComObject(obj))
{
Marshal.ReleaseComObject(obj);
}
obj = null;
}
您需要关闭Excel:
excel.Quit();
对于那些没有阅读评论部分“比如我自己”的人 我有一个函数EndOfRow,我没有做任何清洁来释放物体。创建此函数时,我不知道如何释放对象,但我忘记了它。在一个简单的疏忽上花费了很多时间 忽略辞职也是我解决问题的许多努力中的一个疏忽,但不是主要问题,EndOfRow是 因此,我学到的是在使用excel完成后立即释放对象
谢谢Terry嗨Terry,我修改了我的代码如下,退出确实关闭了一个后台流程,但我还有两个excel流程仍然打开。所以我还是做错了什么。释放对象范围;发布对象工作表;发布目标表;如果是工作簿!=null{workbook.Closefalse,System.Reflection.Missing.Value,System.Reflection.Missing.Value;}releaseObjectworkbook;发布对象工作簿;如果excel!=null{excel.Quit;}releaseObjectexcel@AlanC您确定这些其他流程不是以前遗留下来的吗?请尝试终止所有Excel进程,然后重试您的代码。我以前也有过类似的问题。Excel在自动化之后,在周围闲逛是很糟糕的。是的,谢谢你。。。我的内胎我没有做任何清洁的功能。当我创建此函数时,我不知道如何清理,但我忘记了它。。。再次感谢