[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();
}
上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