我在這裏查看了一些在我的程序運行後襬脫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
在此先感謝您的反饋!
有一些解釋,'ReleaseObject'是一個自定義方法嗎?同樣,如果你只是閱讀文件,爲什麼打開應用程序呢?你可以打開文件並讀入文件。這是一個2007+或2003-文件嗎? – GoldBishop
是ReleaseObj是一種自定義方法。我認爲要訪問工作簿,必須有一個excel應用程序與工作簿進行交互。這些文件可能是.xls或.xlsx文件類型。 – Jared
取決於您是從Excel文檔中抓取數據還是正在玩「孩子」文檔並提取數據?因爲如果基本上將它用作結構化平面文件(即csv),那麼只需創建一個到該文件的數據連接器,就可以更快地訪問它們,並且不會將加載時間與新的事件關聯起來。如果你複製Table/NamedRange複製,那麼你可以做一個我爲我的客戶之前的項目之一做的事情。 – GoldBishop