如何释放 Excel 对象

How to release an Excel Object

在我下面的代码中,我有一个注释掉的 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();

不看评论的小伙伴'such as myself'

我有一个 EndOfRow() 函数,我没有做任何清理来释放对象。我创建这个函数的时候并不知道释放对象,我忘记了。在一个简单的疏忽上花费了很多时间。

遗漏 Quit() 也是我多次尝试解决我的问题时的疏忽,但这不是主要问题,EndOfRow() 是...

所以我学到的是在使用完后立即释放对象 excel。

谢谢特里