2012-09-13 16 views
2

我在這裏查看了一些在我的程序運行後襬脫excel實例的提示,但沒有任何建議似乎可行。當我最初運行它時,它將創建一個excel實例,但程序仍在運行時,通過單擊按鈕重新運行此代碼;它將創建另一個excel實例,但是這次它將刪除它創建的實例,只留下程序第一次運行時創建的實例。Excel的實例在VB.NET中調用Marshal.FinalRelease後仍然存在

我有代碼這是迄今:(更新代碼的2012年9月14日)

Private Sub GetBatchFileContents() 

    Dim xlApp As Excel.Application 
    Dim xlWB As Excel.Workbook 
    Dim xlWS As Excel.Worksheet 
    Dim xlRan As Excel.Range 
    Dim xlVal(,) As Object 
    Dim lastRow As Int32 

    xlApp = New Excel.Application() 
    xlWB = xlApp.Workbooks.Open(TextBox1.Text.ToString(), _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing, _ 
           Type.Missing) 
    xlWS = xlWB.Worksheets.Item(1) 
    lastRow = xlWS.Cells(xlWS.Rows.Count, 1).End(Excel.XlDirection.xlUp).Row 
    xlRan = xlWS.Range(xlWS.Cells(1, 1), xlWS.Cells(lastRow, 130)) 
    xlVal = xlRan.Value2() 
    ReleaseObj(xlRan) 
    ReleaseObj(xlWS) 
    xlWB.Close(False, Type.Missing, Type.Missing) 
    ReleaseObj(xlWB) 
    xlApp.Quit() 
    ReleaseObj(xlApp) 

End Sub 

Private Sub ReleaseObj(ByRef obj As Object) 

    Try 
     Marshal.FinalReleaseComObject(obj) 
    Catch ex As Exception 
     Stop 
    Finally 
     obj = Nothing 
    End Try 

    GC.Collect() 
    GC.WaitForPendingFinalizers() 
    GC.Collect() 

End Sub 

在此先感謝您的反饋!

+0

有一些解釋,'ReleaseObject'是一個自定義方法嗎?同樣,如果你只是閱讀文件,爲什麼打開應用程序呢?你可以打開文件並讀入文件。這是一個2007+或2003-文件嗎? – GoldBishop

+0

是ReleaseObj是一種自定義方法。我認爲要訪問工作簿,必須有一個excel應用程序與工作簿進行交互。這些文件可能是.xls或.xlsx文件類型。 – Jared

+0

取決於您是從Excel文檔中抓取數據還是正在玩「孩子」文檔並提取數據?因爲如果基本上將它用作結構化平面文件(即csv),那麼只需創建一個到該文件的數據連接器,就可以更快地訪問它們,並且不會將加載時間與新的事件關聯起來。如果你複製Table/NamedRange複製,那麼你可以做一個我爲我的客戶之前的項目之一做的事情。 – GoldBishop

回答

1

我有一個非常類似的問題,你所描述的。通過使用它的工作對我來說這示例代碼

' set all Excel related objects to nothing 
columnHeaders = Nothing 
range = Nothing 
endCell = Nothing 
startCell = Nothing 
excelSheet = Nothing 
excelSheets = Nothing 
excelWorkbook.Close() 
excelWorkbook = Nothing 
excelApp.Quit() 
' release com ressources 
Marshal.FinalReleaseComObject(excelApp) ' ! 

excelApp = Nothing 
GC.Collect() 
GC.WaitForPendingFinalizers() 

FinalReleaseComObjectReleaseComObject在MSDN

編輯

Private Sub GetBatchFileContents() 
    Dim xlApp As Excel.Application 
    Dim xlWB As Excel.Workbook 
    Dim xlWS As Excel.Worksheet 
    Dim xlRan As Excel.Range 
    Dim xlVal(,) As Object 
    Dim lastRow As Int32 

    xlApp = New Excel.Application() 
    xlWB = xlApp.Workbooks.Open(TextBox1.Text.ToString(), _ 
           Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, _ 
           Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, _ 
           Type.Missing, Type.Missing, Type.Missing, Type.Missing) 
    xlWS = xlWB.Worksheets.Item(1) 

    ' original 
    'lastRow = xlWS.Cells(xlWS.Rows.Count, 1).End(Excel.XlDirection.xlUp).Row 

    ' new 
    Dim range1 As Excel.Range 
    range1 = xlWS.Cells(xlWS.Rows.Count, 1) 
    Dim range2 As Excel.Range 
    range2 = range1.End(Excel.XlDirection.xlUp) 
    lastRow = range2.Row 
    ReleaseObj(range1) 
    ReleaseObj(range2) 

    ' original 
    'xlRan = xlWS.Range(xlWS.Cells(1, 1), xlWS.Cells(lastRow, 130)) 

    ' new 
    Dim range1_1 As Excel.Range 
    range1_1 = xlWS.Cells(1, 1) 
    Dim rangeLastRow_130 As Excel.Range 
    rangeLastRow_130 = xlWS.Cells(lastRow, 130) 
    xlRan = xlWS.Range(range1_1, rangeLastRow_130) 
    ReleaseObj(range1_1) 
    ReleaseObj(rangeLastRow_130) 

    ' unchanged 
    xlVal = xlRan.Value2() 
    ReleaseObj(xlRan) 
    ReleaseObj(xlWS) 
    xlWB.Close(False, Type.Missing, Type.Missing) 
    ReleaseObj(xlWB) 
    xlApp.Quit() 
    ReleaseObj(xlApp) 
End Sub 

我改變你的代碼分配每一個可能的COM實例變量明確發佈它!但是,因爲它在我的電腦上正常工作,我無法測試它。

此外,我發現一個article描述什麼可能會導致您描述的行爲。

你的Excel加載一個管理加載項(共享加載項或VSTO加載項),這 違反規則。應用程序自動化Excel 應用程序後,Excel應用程序無法正確退出,因爲裝入的AddIn具有一些未發佈的基礎RCW。在這種情況下,即使您的自動化客戶端終止,Excel也不會退出。所以 一步來解決這種問題將禁用所有加載項 隔離根cause.'(見文章的全部細節)

請讓我知道如果我propossals一個適合你!

+0

** Nevermind它沒有工作!**它的工作,直到我使用Excel.Range對象的點。一旦使用了它,它就不會擺脫創建的最初的excel實例。 – Jared

+0

我用給定的xlsx文件和Excel對象庫14(Excel2010)檢查了你的代碼 - 作爲一種魅力!你在用什麼庫? –

+0

即時通訊使用Microsoft Excel 14.0對象庫。另一個問題可能是使用.xls文件而不是新的excel版本.xlsx。 – Jared

0

基本概要我做了什麼。我將這個邏輯併入Workbooks功能的大圖中的鎖定進程中。我必須關閉Echo,否則最終用戶會得到兩個實例之間華麗的交互,如我激活一個工作簿/工作表,然後移動到其他工作簿/工作表。這裏肯定有你可以用的東西;)。

這就是我在我的項目srcwb.Close SaveChanges:=False中使用的所有東西,它關閉了文件。我過去所做的是獲得一個對象參考Application,所以我可以得到實例的系統ID,並從應用程序中關閉它。這當然假設你有代碼隱藏的VBA /項目控制,而不僅僅是一個平面數據文件。

否則,您將不得不在父文件中創建一個集合對象,並且當您在該集合中打開一個新的實例存儲應用程序實例,然後定期運行該集合並驗證該實例是否存在。

相關問題