[C#.NET][VB.NET] 如何 回收 被 VB 及 C# 呼叫的 Excel 應用程式

[C#.NET][VB.NET] 如何 回收 被 VB 及 C# 呼叫的 Excel 應用程式

1.在前幾篇有使用過VB.NET及C#.NET開發 Excel 文件,

http://www.dotblogs.com.tw/yc421206/archive/2009/01/11/6727.aspx

http://www.dotblogs.com.tw/yc421206/archive/2009/01/11/6741.aspx

2.當時候GC回收這樣用,當時候沒有注意到 Excel 有沒有被回收掉,今天要用時卻發現這樣的寫法不會回收

{

       .省略
       .
       .

    System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
    myBook = null;
    mySheet = null;
    myRange = null;
    myExcel = null;
    GC.Collect();
}


快照-2009716144632_thumb[1]

上MSN查了一下它所寫的範例 GC.Collect 方法,原來 GC.Collect 不能寫在呼叫 Excel 方法的同一層,只要將 GC.Collect 移到外面就好

3.把Excel擺在一個方法裡,當方法釋放完 Excel 相關變數的時候,再 GC.Collect

C#

{
    ReadExcel();
    GC.Collect();
} 

private void ReadExcel()
{
    //引用Excel Application類別
    _Application myExcel = null;
    //引用活頁簿類別
    _Workbook myBook = null;
    //引用工作表類別
    _Worksheet mySheet = null;
    //引用Range類別
    Range myRange = null; 

    //開啟一個新的應用程式
    myExcel = new Microsoft.Office.Interop.Excel.Application();
    //加入新的活頁簿
    myExcel.Workbooks.Add(true);
    //停用警告訊息
    myExcel.DisplayAlerts = false;
    //讓Excel文件可見 
    myExcel.Visible = true;
    //引用第一個活頁簿
    myBook = myExcel.Workbooks[1];
    //設定活頁簿焦點
    myBook.Activate();
    //引用第一個工作表
    mySheet = (_Worksheet)myBook.Worksheets[1];
    //命名工作表的名稱為 "Array"
    mySheet.Name = "Cells";
    //設工作表焦點
    mySheet.Activate();
    //關閉活頁簿
    myBook.Close(false, Type.Missing, Type.Missing);
    //關閉Excel
    myExcel.Quit();
    //釋放Excel資源
    System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
    myBook = null;
    mySheet = null;
    myRange = null;
    myExcel = null;
}

VB

    ProcessExcel()
    GC.Collect()
End Sub
Private Sub ProcessExcel()
    CreateArr() '亂數產生陣列
    On Error Resume Next
    '#一部電腦僅執行一個Excel Application, 就算中突開啟Excel也不會影響程式執行
    '#在工作管理員中只會看見一個EXCEL.exe在執行,不會浪費電腦資源
    '#引用正在執行的Excel Application
    xlApp = GetObject(, "Excel.Application")
    '#若發生錯誤表示電腦沒有Excel正在執行,需重新建立一個新的應用程式
    If Err.Number() <> 0 Then
        Err.Clear()
        '#執行一個新的Excel Application
        xlApp = CreateObject("Excel.Application")
        If Err.Number() <> 0 Then
            MsgBox("電腦沒有安裝Excel")
            End
        End If
    End If
    Err.Clear()
    '#Excel活頁簿設定
    '===================================================
    xlBook = xlApp.Workbooks.Add()
    '停用警告訊息
    xlApp.DisplayAlerts = False
    '設置EXCEL對象可見
    xlApp.Visible = True
    '設定活頁簿為焦點
    xlBook.Activate()
    '顯示第一個子視窗
    xlBook.Parent.Windows(1).Visible = True
    '引用第一個工作表
    xlSheet = xlBook.Worksheets(1)
    '設定工作表為焦點
    xlSheet.Activate()
    '關閉當前活頁簿EXCEL
    xlBook.Close()
    xlApp.Quit()
    '回收excel
    System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp)
    xlApp = Nothing
    xlBook = Nothing
    xlSheet = Nothing
    xlRange = Nothing
End Sub

                    

若有謬誤,煩請告知,新手發帖請多包涵


Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET

Image result for microsoft+mvp+logo