C# .NET Excel Prozess bleibt im Task-Manager

42_informatikerIN

Grünschnabel
Hallo Zusammen

Ich bin nun schon tagelang am googlen und habe schon viele verschiedene Lösungen für mein Problem gefunden und ausprobiert. Aber bei mir bleibt der Prozess immer noch im Task-Manager hängen.

Umgebung: Windows XP, MS Excel 2003

Ich erstelle eine Excel Applikation, schreibe Daten aus einer Gridview rein, anschliessend erstelle ich ein Diagramm und schliesse Excel wieder. Der Prozess EXCEL.EXE bleibt aber immer im Task-Manager. :(

Den Prozess abschiessen, möchte ich nicht und als ich es ausprobiert habe hat es nicht funktioniert (Fehler bei process.Kill(); "Access is denied").

Wenn ich nur die Applikation starte, ein Workbook und Worksheet erstelle und wieder schliesse, ist der Prozess weg. Es muss also irgendwo am Code dazwischen liegen. Ich vermute, dass irgendein Objekt noch auf den Prozess referenziert ist, finde aber einfach nicht heraus welches.. :(

Hier der Code meines Excel Exports (Was in der Gridview und in den Dropdownlists steht ist ja nicht relevant, oder? ):

C#:
private void excelerstellen(DropDownList ddlma, DropDownList ddljahr, GridView gridview)
        {
            object n = System.Reflection.Missing.Value;

            Excel.Application xlapp = new Excel.Application();
            Excel.Workbooks workbooks = xlapp.Workbooks;
            Excel.Workbook xlwb = workbooks.Add(n);
            Excel.Sheets sheets = xlapp.Worksheets;
            Excel.Worksheet xlws = (Excel.Worksheet)sheets[1];            
            
            string system = "";
            string ist = "";
            string soll = "";

            try
            {
                if ((bool)Session["Admin"] == true)
                {
                    // Worksheet Name
                    xlws.Name = "Knowhow " + ddlma.SelectedItem.Text;
                    // Überschriften eingeben 
                    xlws.Cells[2, 1] = "Knowhow " + ddlma.SelectedItem.Text + " " + ddljahr.SelectedItem.Text;   //A2  
                }
                else
                {
                    // Worksheet Name
                    xlws.Name = "Knowhow " + lbl_ma_name.Text;
                    // Überschriften eingeben 
                    xlws.Cells[2, 1] = "Knowhow " + lbl_ma_name.Text + " " + ddljahr.SelectedItem.Text;   //A2                }
                xlws.Cells[4, 2] = "Level IST";   //B4 
                xlws.Cells[4, 3] = "Level SOLL";    //C5

                // Formatieren der Überschrift 
                Excel.Range myRangeHeadline;
                myRangeHeadline = xlws.get_Range("A2", "A2");
                myRangeHeadline.Font.Bold = true;

                // Daten eingeben 
                int i = 5;
                foreach (GridViewRow row in gridview.Rows)
                {

                    if (gridview.ID == "gv_ändern_bewertung")
                    {
                        system = row.Cells[5].Text;
                        ist = row.Cells[6].Text;
                        soll = row.Cells[7].Text;
                    }
                    else if (gridview.ID == "gv_ansicht_bewertung")
                    {
                        system = row.Cells[4].Text;
                        ist = row.Cells[5].Text;
                        soll = row.Cells[6].Text;
                    }
                    //System
                    system = system.Replace("ö", "ö").Replace("ä", "ä").Replace("ü", "ü").Replace("&", "&");
                    xlws.Cells[i, 1] = system;

                    // ist
                    int ende1 = ist.IndexOf("'>") + 2;
                    ist = ist.Remove(0, ende1);
                    xlws.Cells[i, 2] = ist.Remove(1, ist.Length - 1);

                    //soll                    
                    int ende2 = soll.IndexOf("'>") + 2;
                    soll = soll.Remove(0, ende2);
                    xlws.Cells[i, 3] = soll.Remove(1, soll.Length - 1);
                    i++;
                }
                string letzte = (i - 1).ToString();   
                xlws.get_Range("A1", "A10").EntireColumn.AutoFit();
                // Chart erzeugen          
                Excel.Chart myChart = (Excel.Chart)xlwb.Charts.Add(n, n, n, n);
                myChart.ChartType = Excel.XlChartType.xlRadar;
                myChart.HasLegend = true;
                myChart.PlotBy = Excel.XlRowCol.xlColumns;
              
                // Datenquelle festlegen
                Excel.Range range = xlws.get_Range("A4", "C" + letzte);
                myChart.SetSourceData(range, Type.Missing);
                myChart.HasTitle = true;                                                            
                myChart.ChartTitle.Text = xlws.Name.ToString();               

                myChart.CopyPicture(Excel.XlPictureAppearance.xlScreen, Excel.XlCopyPictureFormat.xlBitmap, Excel.XlPictureAppearance.xlScreen);
                myChart.Location(Excel.XlChartLocation.xlLocationAsObject, xlws.Name);
                string pfad_app = HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath);
                if (pfad_app.EndsWith(@"\"))
                {
                    pfad_app = pfad_app + @"Excel\" + Session["Username"].ToString() + ".xls";
                }
                else
                {
                    pfad_app = pfad_app + @"\Excel\" + Session["Username"].ToString() + ".xls";
                }
                // wenn die Datei schon vorhanden ist, kommt in Excel eine Meldung ob man überschreiben will, diese wird hier ausgeschaltet.
                xlapp.DisplayAlerts = false;
                xlapp.AlertBeforeOverwriting = false;
                // Excel Datei abspeichern              
                xlwb.SaveAs(pfad_app, n, n, n, n, n, Excel.XlSaveAsAccessMode.xlNoChange, n, n, n, n, n);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
                range = null;
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(myChart);
                myChart = null;
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(myRangeHeadline);
                myRangeHeadline = null;                           
            }
            catch (Exception ex)
            {
                lbl_Fehlermeldung.Text = ex.Message;
                lbl_Fehlermeldung.Visible = true;
            }
            finally
            {                
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlws.Cells);
                foreach (Excel.Worksheet worksheet in sheets)
                {
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(worksheet);
                }
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(sheets);
                sheets = null;
                foreach (Excel.Workbook workbook in workbooks)
                {
                    workbook.Close(false, n, n);
                    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workbook);
                }
                xlapp.Workbooks.Close();
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workbooks);
                workbooks = null;
                xlapp.Application.Quit();
                xlapp.Quit();
                System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlapp);
                xlapp = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();                            
            }
        }

Vielen Dank im Voraus!!
Liebe Grüsse 42_informatikerIN :)
 
Zuletzt bearbeitet von einem Moderator:
Danke, aber wie du siehst habe ich das alles bereits in meinem Code berücksichtigt.
Trotzdem bleibt anscheinend irgendwo noch ein COM Objekt offen.
Und wie bereits beschrieben, wenn ich den Teil mit dem dem füllen und dem Diagramm rausnehme, funktionierts und der Excel Prozess wird geschlossen.

Hoffe jemand hat eine Lösung für mein Problem!
LG
 
Zurück