Excel进程不关闭

这个问题在这里已经有了答案:

  • 如何正确清理Excel互操作对象? 36个答案

  • 这是一个关于办公应用程序在.NET应用程序断开连接后保持打开状态的有趣知识库。

    从Visual Studio .NET客户端自动化后Office应用程序不会退出

    代码示例都在链接中(vb.net抱歉)。 基本上它会告诉你如何正确设置和拆卸办公室应用程序,以便在完成后关闭它。

    System.Runtime.InteropServices.Marshal.FinalReleaseComObject是魔术发生的地方。

    编辑:您需要为您创建的每个Excel对象调用FinalReleaseComObject。

    if (excelWorkSheet1 != null)
    {
        Marshal.FinalReleaseComObject(excelWorkSheet1);
        excelWorkSheet1 = null;
    }
    if (excelWorkbook != null)
    {
        Marshal.FinalReleaseComObject(excelWorkbook);
        excelWorkbook = null;
    }
    if (excelApp != null)
    {
        Marshal.FinalReleaseComObject(excelApp);
        excelApp = null;
    }
    

    DotNet只在所有手柄释放后才释放COM对象。 我所做的是评论一切,然后加回一部分。 看看它是否发布Excel。 如果它不遵循以下规则。 当它释放时,添加更多的代码,直到它不再次释放。

    1)创建Excel变量时,将所有值设置为空(这样可以避免未启动的错误)

    2)不要重复使用变量而不先释放它Marshal.FinalReleaseComObject

    3)不要双点(ab = z) 。 dotNet创建一个临时变量,它不会被释放。

    c = a.b;
    c = z;
    Marshal.FinalReleaseComObject(c);
    

    4)发布所有的Excel变量。 越快越好。

    5)将其设置回NULL。

    将文化设置为“en-US”。 有一个错误会使Excel与某些文化碰撞。 这确保它不会。

    以下是关于如何构建代码的一个想法:

            thisThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
            InteropExcel.Application excelApp = null;
            InteropExcel.Workbooks wkbks = null;
            InteropExcel.Workbook wkbk = null;
            try
            {
                    excelApp = new InteropExcel.Application();
                    wkbks = excelApp.Workbooks;
                    wkbk = wkbks.Open(fileName);
    ...
    
            }
            catch (Exception ex)
            {
            }
    
            if (wkbk != null)
            {
                excelApp.DisplayAlerts = false;
                wkbk.Close(false);
                Marshal.FinalReleaseComObject(wkbk);
                wkbk = null;
            }
    
            if (wkbks != null)
            {
                wkbks.Close();
                Marshal.FinalReleaseComObject(wkbks);
                wkbks = null;
            }
    
            if (excelApp != null)
            {
                // Close Excel.
                excelApp.Quit();
                Marshal.FinalReleaseComObject(excelApp);
                excelApp = null;
            }
    
            // Change culture back from en-us to the original culture.
            thisThread.CurrentCulture = originalCulture;    
        }
    

    我终于完成了。 您需要为Workbooks集合添加一个变量,然后按照其他答案中所述使用FinalReleaseComObject。 我想你使用的每个可能的Excel COM对象必须以这种方式处理。

    try
            {
               // Create an instance of Microsoft Excel and make it invisible
               excelApp = new Excel.Application();
               excelApp.DisplayAlerts = false;
               excelApp.Visible = false;
    
               // open a Workbook and get the active Worksheet
    
               excelWorkbooks = excelApp.Workbooks;
               excelWorkbook = excelWorkbooks.Open(excelFile, Type.Missing, true);
               excelWorkSheet1 = excelWorkbook.ActiveSheet;
    
            }
            catch
            {
               throw;
            }
            finally
            {
    
               NAR( excelWorkSheet1 );
               excelWorkbook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
               NAR(excelWorkbook);
               NAR(excelWorkbooks);
               excelApp.Quit();
               NAR(excelApp);
    
            }
         }
         private void NAR(object o)
         {
            try
            {
               System.Runtime.InteropServices.Marshal.FinalReleaseComObject( o );
            }
            catch { }
            finally
            {
               o = null;
            }
         }
    
    链接地址: http://www.djcxy.com/p/73529.html

    上一篇: Excel process not closing

    下一篇: How to calculate the angle of the sun above the horizon using pyEphem