Announcement

Collapse
No announcement yet.

Excel in Schleifendurchlauf öffnen, reinschreiben und schließen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Excel in Schleifendurchlauf öffnen, reinschreiben und schließen

    Hallo!

    Ich möchte in C# im Visual Studio in einer Schleife bei jedem Durchlauf:

    1.) Eine neue ExcelDatei erzeugen
    2.) In Sie etwas reinschreiben
    3.) Die Datei speichern und schließen

    Folgenden Code habe ich geschrieben:

    for (...)
    {
    static int rows = 1;
    //neue Application
    Excel.Application excelApp = new Excel.Application();
    excelApp.Workbooks.Add(Excel.XlWBATemplate.xlWBATW orksheet);
    Excel.Worksheet excelWS = (Excel.Worksheet)excelWB.Worksheets[1];
    excelWS.Name = "test";
    excelWS.Cells[1,1] = "überschrift";
    excelApp.Visible = true;

    for(...)
    {
    //Inhalte einfügen
    excelWS.Cells[++rows, 1] = "inhalt";
    }

    //Application schließen
    excelWB.Close(true, filename, true);
    excelApp.Quit();
    }

    Das Problem ist, dass es im ersten Schleifendurchlauf immer funktioniert, danach nicht mehr. Es wird zwar die Application geschlossen, eine neue geöffnet mit einem neuen sheet und der Überschrift, jedoch wird der Inhalt nicht mehr eingefügt.

    Vielleicht kann mit einer von euch da weiterhelfen?!?!?!
    Danke
    Jazzzi

  • #2
    Lösung: Prozess endet nicht

    Hi,

    Ich hab die Lösung gefunden. Der Excelprozess wird trotz Quit() und Close() nicht beendet.
    Ich kille jetzt knallhart den Prozess, weil ich keine andere Lösung gefunden habe:

    Quellcode:

    System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("EXC EL");

    if(p[0] != null)
    {
    p[0].Kill();
    }

    Nicht schön, aber es funktioniert.

    MFG
    Jazzzi

    @wolfsgrube: Such Dir nen Job!!!

    Comment


    • #3
      Hallo,

      das Abschießen des Prozesses sollte nur die letzte Option sein. Das Problem verschwindet, wenn die eigene Anwendung auch die Verweise der PIA's über den Aufruf von Marshal.ReleaseComObject (Namespace System.Runtime.InteropServices) korrekt freigibt. Die Regeln von COM besagen, dass eine COM-Instanz erst dann freigegeben wird, wenn der letzte Interfacezeiger auf diese Instanz freigebeben wurde. Im Fall einer .NET-Anwendung ist dies erst dann der Fall, wenn ReleaseComObject aufgerufen wurde (jeweils für das Sheet, das Workbook und die Application-Instanz von Excel).

      Comment


      • #4
        Hallo Andreas,

        Danke für die Antwort.
        Endlich mal ne vernünftige Lösung. Ich hatte schon versucht nur die Application freizugeben, aber das hat nicht geklappt, aber

        Marshal.ReleaseComObject(this.excelWorkBook);
        Marshal.ReleaseComObject(this.excelWorkSheet);
        Marshal.ReleaseComObject(this.excelApplication);

        funktioniert wunderbar.
        Prozess killen, war letzte Option.

        Danke
        Jazzzi

        Comment

        Working...
        X