【问题标题】:Excel Not closing properly even after Releasing Objects/Variables即使在释放对象/变量后 Excel 也无法正确关闭
【发布时间】:2017-04-26 01:46:06
【问题描述】:

在阅读了一些帖子并尝试了一些事情之后。释放对象后,我仍然没有让 excel 正确关闭。

我执行以下操作: Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();

        if (xlApp == null)
        {
            //MessageBox.Show("Excel is not properly installed!!");
            return;
        }

        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;

        if (!System.IO.File.Exists("file.xlsx"))
        {
            xlWorkBook = xlApp.Workbooks.Add(misValue);
        }
        else
        {
            xlWorkBook = xlApp.Workbooks.Open("file.xlsx", 0, false, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", true, false, 0, true, 1, 0);
        }

        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
        xlWorkSheet.Name = "Sheet Name";

然后关闭excel,去掉对象:

        xlApp.DisplayAlerts = false;
        xlWorkBook.SaveAs("file.xlsx");
        xlWorkBook.Close(true, "file.xlsx", misValue);
        xlApp.Application.Quit();
        xlApp.Quit();


        Marshal.ReleaseComObject(xlWorkSheet);
        Marshal.ReleaseComObject(xlWorkBook);
        Marshal.ReleaseComObject(xlApp);

        xlApp = null;

即使我这样做了,我仍然在任务管理器中看到 excel.exe。有人可以帮我解决我在这里做错的事情。我真的很感激。

【问题讨论】:

    标签: c# excel


    【解决方案1】:

    这是我用来终止进程的方法。它有效,但如果有人有更优雅的解决方案,我也很乐意知道!

    private void releaseObject(object obj)
        {
            try
            {
                Marshal.ReleaseComObject(obj);
                obj = null;
    
                var process = System.Diagnostics.Process.GetProcessesByName("Excel");
                foreach (var p in process)
                {
                    if (!string.IsNullOrEmpty(p.ProcessName))
                    {
                        try
                        {
                            p.Kill();
                        }
                        catch { }
                    }
                }
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the Excel Object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
        }
    

    在每个对象上调用它

    releaseObject(worksheet);
    releaseObject(workbook);
    releaseObject(xlapplication);
    

    【讨论】:

      猜你喜欢
      • 2017-07-08
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 2020-12-14
      • 2010-11-29
      相关资源
      最近更新 更多