Announcement

Collapse
No announcement yet.

Excel-Prozess wird nicht geschlossen

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

  • Excel-Prozess wird nicht geschlossen

    Hallo,

    ich habe mir einen Excel Export in ASP(VB.NET) geschrieben.
    Es funktioniert soweit alles, nur wenn ich den den Browser oder Excel schließe, bleibt der Excel-Prozess offen.

    Ich schließe das ganze auf folgende Art:

    <PRE>
    xlBook.SaveAs("c:\excel_test\mappe1.xls")
    xlApp.Workbooks.Close()
    xlApp.Quit()
    xlApp = Nothing
    </PRE>

    Wie muss ich die Application richtig schließen damit auch der Excel-Prozess geschlossen wird ?

    MfG Hans Rau

  • #2
    Hallo,

    über <b>Marshal.ReleaseComObject</b> muss man selbst die Kontrolle über den Zeitpunkt des Freigebens aller Interface-Zeiger auf Excel übernehmen:

    <pre>
    ' Compiler-Unterstützung für die späte Bindung anfordern
    Option Strict Off
    <br>
    Imports System.Runtime.InteropServices
    <br>
    Private Sub ButtonGetObject_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonGetObject.Click
    Dim XlApp As Object
    Dim XlBook As Object
    Dim XlWorkBooks As Object
    Dim XlSheet As Object
    <br>
    Try
    ' Versuch 1: Auf laufende Instanz aus der ROT aufschalten
    XlApp = GetObject(, "Excel.Application")
    Catch err As System.Exception
    Try
    ' Versuch 2: Neue Instanz anfordern
    XlApp = CreateObject("Excel.Application")
    Catch ex As Exception
    MessageBox.Show("Automation-Instanz von Excel kann nicht angefordert werden,", _
    "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    End Try
    <br>
    End Try
    XlApp.ScreenUpdating = False
    XlWorkBooks = XlApp.Workbooks
    XlBook = XlWorkBooks.Add
    XlSheet = XlBook.worksheets(1)
    XlSheet.activate()
    ' Spaltenüberschrift
    Dim Col As Integer
    For Col = 1 To 3
    XlSheet.cells(1, Col).font.bold = True<br>
    XlSheet.cells(1, Col) = String.Format("Spalte {0}", Col)
    Next Col
    XlApp.screenupdating = True
    ' Benutzer soll mit Excel-GUI arbeiten
    XlApp.usercontrol = True
    Dim ApplicationObject As Object
    ApplicationObject = XlSheet.application
    ' Excel anzeigen
    ApplicationObject.visible = True
    <br>
    MessageBox.Show("Excel ist sichtbar")
    <br>
    ' Automation-Instanz von Excel schließen
    XlBook.Close(SaveChanges:=False)
    XlApp.Quit()
    ' Verweise auf die Interface-Zeiger freigegeben
    Marshal.ReleaseComObject(ApplicationObject)
    Marshal.ReleaseComObject(XlSheet)
    Marshal.ReleaseComObject(XlBook)
    Marshal.ReleaseComObject(XlWorkBooks)
    Marshal.ReleaseComObject(XlApp)
    End Sub
    </pre&gt

    Comment


    • #3
      Danke für die schnelle Antwort. Aber das löst leider mein Problem nocht nicht. Ihre Lösung funktioniert bei mir nur wenn ich eine Windows-Applikation(exe) schreibe. Wenn ich das ganze von einem Webserver aus machen will, dann bleibt der Excel-Prozess weiter offen, bzw. es wird Excel auf dem Webserver gestartet.

      Geht das überhaupt, dass ich mit asp.net mir Daten über einen Webserver hole und die dann lokal zur Verfügung habe ?
      Ich habe es bisher nur mit einer CSV-Datei geschafft, die von meiner Seite erstellt wird und dann per Download-Link runtergeladen werden kann

      Comment


      • #4
        Hallo,

        eine harte Methode, aber bei mir funktioniert es ganz gut

        Dim Proc, Processes() As Process
        Processes = Process.GetProcessesByName("excel")
        For Each Proc In Processes
        Proc.Kill()
        Nex

        Comment


        • #5
          Hallo,
          &gt;..bleibt der Excel-Prozess offen...
          wenn die <i>Marshal.ReleaseComObject</i>-Technik verwendet wird, muss man auch <b>alle</b> direkt/indirekt angeforderten Interface-Zeiger über diesen Weg freigeben. Alternativ zu dieser filigranen Technik gibt es auch den COM Interop-Holzhammer, der "global" abräumt:
          <code>
          XlApp.Quit()
          XlApp = Nothing
          GC.Collect()
          GC.WaitForPendingFinalizers()
          GC.Collect()
          GC.WaitForPendingFinalizers()
          </code&gt

          Comment


          • #6
            Originally posted by Andreas Kosch View Post
            über <b>Marshal.ReleaseComObject</b> muss man selbst die Kontrolle über den Zeitpunkt des Freigebens aller Interface-Zeiger auf Excel übernehmen:
            Hallo,
            mir ist das alles noch nicht klar, arbeite daran.

            Punkt 1. kann ich mit dem Code von Andreas Kosch umsetzen, aber Punkt 2. schaffe ich nicht.

            1. Ich versuche ein Excel zu öffnen, oder ein geöffnetes aktiv zu machen, damit ich dann dort Daten hineinschreiben kann.

            2. Ich will ein zweites mal in die gleiche Exceldatei Daten schreiben. Aber immer öffnet sich ein neues Excel. Habe den Code so verändert, warum öffnet sich bei jedem Buttonklick ein neues Excel?

            Was müßte ich tun um beispielsweise (sinnloses Bsp., aber dieses Prinzip brauche ich) eine Uhr von VB aus per Timer, in Excel zu aktualiseren? Aslo ich will zB. alle 500 Millisekunden einen neuen Wert von VB immer in die gleiche Zelle in Excel schreiben.


            Code:
            ' Compiler-Unterstützung für die späte Bindung anfordern
            Option Strict Off
            Imports System.Runtime.InteropServices
            
                    Dim XlApp As Object
                    Dim XlBook As Object
                    Dim XlWorkBooks As Object
                    Dim XlSheet As Object
            
                    Try
                        ' Versuch 1: Auf laufende Instanz aus der ROT aufschalten
                        XlApp = GetObject(, "Excel.Application")
                    Catch err As System.Exception
            
                        Try
                            ' Versuch 2: Neue Instanz anfordern
                            XlApp = CreateObject("Excel.Application")
                        Catch ex As Exception
                            MessageBox.Show("Automation-Instanz von Excel kann nicht angefordert werden,", _
                              "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
                        End Try
                    End Try
            
                    XlApp.Visible = True
                    XlApp.ScreenUpdating = False
                    XlWorkBooks = XlApp.Workbooks
                    XlBook = XlWorkBooks.Add
                    XlSheet = XlBook.worksheets(1)
                    XlSheet.activate()
            
                    ' Diese Zelle "B3" soll zB. ständig neue Werte erhalten 
                    XlSheet.Range("B3").Value = My.Computer.Clock.LocalTime.ToLongTimeString
                    XlApp.screenupdating = True
                End Sub
            Bin für jeden Tip dankbar.

            Comment

            Working...
            X