2016-03-31 2 views
0

Ich habe zuvor schwebende EXCEL.EXE-Dateien aufgelöst, indem Sie das Arbeitsblatt, die Arbeitsmappe und die Anwendungsobjekte von EXCEL freigegeben haben. Allerdings habe ich bemerkt, dass nach dem Verweis auf Zellbereiche, dass diese EXE-Datei zurückkommt.Floating EXCEL.EXE verursacht durch referenzierte Zellen in vb.net

Ich habe den Abschnitt auskommentiert, wo ich diese Zellen referenziere und das ist in der Tat, was vor sich geht. Ich habe versucht, die Zelle selbst und die Reichweite der Zelle freizugeben, aber das funktioniert nicht.

Ich weiß, dass dies eine wiederholte Frage sein kann, aber es ist etwas, was ich wirklich mit Verständnis habe.

 Dim app As New Microsoft.Office.Interop.Excel.Application 
    Dim book As Microsoft.Office.Interop.Excel.Workbook = app.Workbooks.Open(file) 
    Dim worksheet As Microsoft.Office.Interop.Excel.Worksheet = book.Worksheets("Sheet1") 
    app.Visible = True 
    While (worksheet.Cells.Range("A" & max_row).Value IsNot Nothing) 
     max_row = max_row + 1 
    End While 
    If max_row > 2 Or max_row = 2 Then 
     For i As Integer = 2 To max_row Step 1 
      MessageBox.Show("here") 
      Dim add As DataRow = Me.CentralDatabaseDataSet.Selected_Equipment.NewRow 
      If "Section " & worksheet.Cells.Range("J" & i).Text = cboSection.SelectedItem.ToString Then 
       add("Type") = worksheet.Cells.Range("A" & i).Text 
       ReleaseObject(worksheet.Cells(i, 1)) 
       'add("Description") = worksheet.Cells.Range("B" & i).Text 
       'add("Model Number") = worksheet.Cells.Range("C" & i).Text 
       'add("Serial Number") = worksheet.Cells.Range("D" & i).Text 
       'add("Asset Number") = worksheet.Cells.Range("E" & i).Text 
       'add("Manufacturer ID") = worksheet.Cells.Range("F" & i).Text 
       'add("Department ID") = worksheet.Cells.Range("G" & i).Text 
       'add("Last Calibration") = worksheet.Cells.Range("H" & i).Text 
       'add("Calibration Due Date") = worksheet.Cells.Range("I" & i).Text 
       'Me.CentralDatabaseDataSet.Selected_Equipment.AddSelected_EquipmentRow(add) 
      End If 
     Next 
    End If 
    book.Close() 
    app.Quit() 
    ReleaseObject(worksheet) 
    ReleaseObject(book) 
    ReleaseObject(app) 
+0

Es gibt eine Menge Dinge, die [hier], um zu versuchen (http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel -Interop-Objekte). Persönlich würde ich das [Open XML SDK] (https://msdn.microsoft.com/en-us/library/office/bb448854.aspx) mit einem der verfügbaren Wrapper verwenden (zB [ClosedXML] (http: // closedxml .codeplex.com /), [EPPlus] (http://epplus.codeplex.com/), [SpreadsheetLight] (http://spreadsheetlight.com/)) und sich nicht um all diese COM-Interop-Probleme kümmern. – Mark

+0

Vielen Dank für die Antwort. Ich arbeite an der Anwendung der Lösungen, die in Ihrem Link geben, aber es gibt nichts speziell für meinen Fall. Wenn ich es herausfinde, werde ich meine neue Lösung veröffentlichen. –

+0

Ich würde denken, dass viele der Antworten speziell für Ihren Fall gelten - "Nie 2 Punkte mit com-Objekten verwenden" ist ein häufiges Thema, und es gibt viele Beispiele in Ihrem Code, wo Sie mehrere Punkte beim Aufruf der COM-Objekte - z. In 'worksheet.Cells.Range (" J "& i) .Text" befreien Sie nicht die Objekte, die von 'Cells' und' Range' zurückgegeben werden. Sie könnten versuchen, die Aufrufe 'GC.Collect()' und 'GC.WaitForPendingFinalizers()' hinzuzufügen und zu sehen, ob das hilft (vielleicht sogar zweimal aufrufen, wie einige vorschlagen). – Mark

Antwort

0

Sie haben nie Marshal.ReleaseComObject() zu nennen - der bessere Ansatz ist es, die .NET Garbage Collector aufrufen durch den Aufruf GC.Collect() aufzuräumen.

Sie müssen darauf achten, dass der Code, der mit Excel kommuniziert, nicht mit der Methode GC.Collect() übereinstimmt, sonst könnte der Debugger Objekte länger am Leben erhalten als erwartet.

würde das allgemeine Muster sein:

Sub WrapperThatCleansUp() 

    ' NOTE: Don't call Excel objects in here... 
    '  Debugger would keep alive until end, preventing GC cleanup 

    ' Call a separate function that talks to Excel 
    DoTheWork() 

    ' Now Let the GC clean up (twice, to clean up cycles too) 
    GC.Collect()  
    GC.WaitForPendingFinalizers() 
    GC.Collect()  
    GC.WaitForPendingFinalizers() 

End Sub 

Sub DoTheWork() 
    Dim app As New Microsoft.Office.Interop.Excel.Application 
    Dim book As Microsoft.Office.Interop.Excel.Workbook = app.Workbooks.Add() 
    Dim worksheet As Microsoft.Office.Interop.Excel.Worksheet = book.Worksheets("Sheet1") 
    app.Visible = True 
    For i As Integer = 1 To 10 
     worksheet.Cells.Range("A" & i).Value = "Hello" 
    Next 
    book.Save() 
    book.Close() 
    app.Quit() 

    ' NOTE: No calls the Marshal.ReleaseComObject() are ever needed 
End Sub 
+0

Vielen Dank, das hat für mich funktioniert! –

Verwandte Themen