如何释放Excel对象

问题描述

在下面的代码中,我注释了一个foreach循环,该循环有效,但由于后台枚举而不会释放excel对象。因此,我试图将其转换为for循环,但是直到这一点为止,我都避免了“ for”循环,而且我似乎无法使我的工作正常。我只是指出我知道它已经坏了。

我确实注释掉了损坏的“ for”循环,该循环可以运行,并且所有工作都按预期进行,但是我无法释放excel对象... 我的问题是,我尝试了许多不同的示例,但无法从任务管理器中释放excel对象,并且该对象在后台仍然处于打开状态。

  • 我使用“一个点”规则
  • 我正在尝试/决赛
  • 我尝试了许多不同的Marshal.ReleaseComOjbect(obj),网上的例子
  • 我正在使用“ for循环”(不是foreach循环),因此没有隐藏的Enum对象

谢谢您的帮助和教育

我的代码

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(),我没有做任何清理来释放对象的功能。创建此函数时,我不知道释放对象,却忘了它。一个简单的监督就花了很多时间。

在我解决许多问题的过程中,遗漏Quit()也是我的疏忽,但这并不是主要问题,EndOfRow()是...

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

谢谢特里