Ich habe eine Exportfunktion für ein kleines C# Programmgeschrieben und nutze die COM Objekte um die Daten ins Excel zu exportieren, nur leider verschwindet der Prozess EXCEL.EXE nicht nach der Ausführung aus dem Taskmanager. Ich habe es zuerst sehr unsauber gelöst (mit Process.Kill) und möchte es nun doch bisschen professioneller lösen .
Kurze Erklärung bevor der Code folgt.
Ich instanziere COM-Objekte eins für die Applikation, Worksbook und zwei Worksheet objekte. Die objekte werden in umgekehrter Reihenfolge wie sie Instanziertwurden wieder mit ReleaseComObject freigegeben zudem wird Workbook.Close und Application.Quit verwendet und nach dem Release die Objekte auf null gesetzt.
Ich denke mal das die Objekte nicht so ganz freigegeben werden wie ich es gerne hätte, da sonst ja auch der Prozess ausm Taskmanager verschwinden würde. Auch wenn ich mal 10min eine Rauchen gehe ist danach der Prozess immernoch gestartet (von daher kann ich ausschließen, dass der Prozess erst später, sondern überhaupt nicht beendet wird
Aber zur veranschaulichung der code
//Objektinstanzierung
Microsoft.Office.Interop.Excel.ApplicationClass ThisApplication = new Microsoft.Office.Interop.Excel.ApplicationClass();
Microsoft.Office.Interop.Excel.Workbook ThisWorkbook = ThisApplication.Application.Workbooks.Add(Type.Missing);
Microsoft.Office.Interop.Excel.Worksheet ThisWorksheet1 = null;
Microsoft.Office.Interop.Excel.Worksheet ThisWorksheet2 = null;
ThisWorksheet1 = (Microsoft.Office.Interop.Excel.Worksheet)ThisApplication.ActiveWorkbook.Sheets[1];
ThisWorksheet2 = (Microsoft.Office.Interop.Excel.Worksheet)ThisApplication.ActiveWorkbook.Sheets[2];
ThisWorksheet1.Cells[i+intRowModifier,1] = tmpArray[0];
System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisWorksheet2);
ThisWorksheet2 = null;
System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisWorksheet1);
ThisWorksheet1 = null;
ThisWorkbook.Close(false, Type.Missing, Type.Missing);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisWorkbook);
ThisWorkbook = null;
ThisApplication.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisApplication);
ThisApplication = null;
Die Verarbeitung und Zuweisung ist natürlich bisschen komplexer aber die Wertezuweisung zu den Zellen läuft immer nach dem Selben Prinzip ab.
Der Excel Prozess will sich einfach nicht danach beenden. Und ich weiß leider auch nicht mehr weiter.