Exel 2007 Prozess schließen

r0cka

Grünschnabel
Hallo,

ich habe ein kleines Problem mit dem Beenden einer Excel 2007 Instanz. Ich hatte mit früheren Versionen (2000 - 2003) nie diese Probleme.
Ich lesen eine Blatt ein und fülle ein Array mit den entsprechenden Daten. Am Ende schließe ich Excel mit der Funktion shutDownExcel(sh, wb, ExcelObj) :

Code:
#region Close Excel
        // from microsofts MSDN
        private void NAR(object o)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            finally
            {
                o = null;
            }
        }
        //not from the msdn
        private void shutDownExcel(Microsoft.Office.Interop.Excel.Worksheet workSheet, Microsoft.Office.Interop.Excel.Workbook workBook, Microsoft.Office.Interop.Excel.ApplicationClass app)
        {

            if (workSheet != null) NAR(workSheet);
            if (workBook != null) workBook.Close(false, false, Type.Missing);
            if (workBook != null) NAR(workBook);
            if (app != null) app.Quit();
            if (app != null) NAR(app);
            GC.Collect();
            GC.WaitForPendingFinalizers();
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }

        #endregion

Leider sind die Excel Prozesse immer noch im TaskManager. Wie gesagt mit älteren Versionen hatte ich diese Probleme noch nie. Weiß jemand rat?

Danke und Grüße
Philipp
 
Du musst jedes einzelne Office-Objekt per
Code:
Marshal.ReleaseComObject (myOfficeObject);
myOfficeObject = null;
freigeben.

Du solltest auch sicherstellen, dass alle verwendeten Objekte freigegeben werden, wenn die Anwendung aus einem unerwarteten Grund beendet wird. Siehe try - catch - finally.
 
Hallo Ihr beiden,

ersteinmal danke für Antworten, aber wie man in meinem Snippet sehen kann, habe 1. den Hinweis der MSDN schon befolgt und 2. auch schon das Excel Objekt über Marshal.ReleaseComObject freigebe ;).

Es muss also an irgendetwas anderem liegen. Das komische ist, dass wenn ich das Excel Objekt dierekt nach der Erstellung freigebe, dann beendet dich der Excel Prozess korrekt:

Code:
Microsoft.Office.Interop.Excel.ApplicationClass ExcelObj = new Microsoft.Office.Interop.Excel.ApplicationClass();
            Workbook wb = null;
            Worksheet sh = null;
            Range range = null;
            char[] charArr = { '$' };
            
            //Dollar aus Workbooknamen entfernen
            TableName = TableName.Trim(charArr);

            //Optionen um den Vorgang zu beschleunigen
            ExcelObj.Visible = false;
            ExcelObj.ScreenUpdating = false;
            ExcelObj.DisplayAlerts = false;
            string execPath =
            Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);

//Excel freigeben
shutDownExcel(sh, wb, ExcelObj);

Wenn ich allerdings ein Workbook öffne und danach versuche Excel freizugeben bleibt der Task im im Task Manager bestehen:

Code:
Microsoft.Office.Interop.Excel.ApplicationClass ExcelObj = new Microsoft.Office.Interop.Excel.ApplicationClass();
            Workbook wb = null;
            Worksheet sh = null;
            Range range = null;
            char[] charArr = { '$' };
            
            //Dollar aus Workbooknamen entfernen
            TableName = TableName.Trim(charArr);

            //Optionen um den Vorgang zu beschleunigen
            ExcelObj.Visible = false;
            ExcelObj.ScreenUpdating = false;
            ExcelObj.DisplayAlerts = false;
            string execPath =
            Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase);

            wb = ExcelObj.Workbooks.Open(FileName,
            0, true, 5, "", "", Missing.Value, Missing.Value,
            Missing.Value, false, Missing.Value, Missing.Value,
            Missing.Value, Missing.Value, Missing.Value);

//Excel freigeben
shutDownExcel(sh, wb, ExcelObj);

Danke für jede Hilfe und Grüße
Philipp
 
Hallo,

ich hatte das gleiche Problem und bin dann auf folgenden Link vom Microsoft Support gekommen:

http://support.microsoft.com/kb/317109/de

Danach werden alle Excel Prozesse aus der Taskleiste ausgetragen, auch wenn die Excelfenster vorher von "Hand" geschlossen wurden.

mein Code dazu:


Dim xlApp As Excel.Application
Dim xlbook As Excel.Workbook
Dim xlsheet As Excel.Worksheet
-------

Sub ExcelÖffnen()
xlApp = New Excel.Application
xlApp.Workbooks.Add()
xlbook = xlApp.ActiveWorkbook
xlApp.Visible = True
xlsheet = xlApp.ActiveSheet

-------

Sub ExcelBlattSchliesen()

NAR(xlsheet)
Try
xlbook.Close()
Catch ex As Exception
MsgBox(ex.ToString)
End Try

NAR(xlbook)
Try
xlApp.Quit()
Catch ex As Exception
MsgBox(ex.ToString)
End Try

NAR(xlApp)
GC.Collect()
GC.WaitForPendingFinalizers()
End Sub

Private Sub NAR(ByVal o As Object)
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(o)
Catch
Finally
o = Nothing
End Try
End Sub
 
Zurück