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? ):
Vielen Dank im Voraus!!
Liebe Grüsse 42_informatikerIN
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: