Announcement

Collapse
No announcement yet.

Versionsunabhängige Excel-Schnittstelle

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

  • Versionsunabhängige Excel-Schnittstelle

    Hallo Leutz,

    hab leider ein Problem mit der Ansprache von Excel.

    Ich möchte in eine bestehende Excel-Datei daten reinschaufeln. Soweit so gut, Problem ist nur dass es bei allen Office-Versionen funktionieren muss.

    Unter Verweis/Hinzufügen/com Excel11 ist das für mein Eigenes System möglich, nicht aber für Office 2K oder XP.

    Hoffe dass einer ein kleines Skript noch übrig hat:-)

    Vielen Dank im Voraus
    Micha

  • #2
    Hallo,

    in diesem Fall (die Typbibliothek der ältestes Excel-Version ist auf dem eigenen Entwicklungs-Rechner nicht greifbar) wird <b>kein</b> Verweis auf das Automation-Objekt von Excel hinzugefügt, sondern statt dessen die speziellen Fähigkeiten von VB.NET (späte Bindung) genutzt:
    <pre>
    ' Compiler-Unterstützung für die späte Bindung anfordern
    Option Strict Off
    <br>
    Imports System.Runtime.InteropServices
    <br>
    ...
    <br>
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim XlApp As Object
    Dim XlBook As Object
    Dim XlWorkBooks As Object
    Dim XlSheet As Object
    <br>
    Try
    ' Neue Instanz anfordern
    XlApp = CreateObject("Excel.Application")
    Catch err As Exception
    MessageBox.Show("Automation-Instanz von Excel kann nicht angefordert werden,", _
    "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error)
    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
    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
      Ist da gar kein Spagat möglich, der es ermöglicht, die Vorteile der frühen Bindung und der alten Typbibliothek zu nutzen? In Delphi kann ich die Importe der alten Typbibliotheken ja problemlos mitnehmen, ist so etwas auch in .Net möglich?<p>
      Schöne Grüße, Mario Noac
      Schöne Grüße, Mario

      Comment


      • #4
        Hallo,

        gegenüber früher hat sich nichts geändert, solange man beim Kommandozeilen-Kompiler bleibt :-)

        Nur der Dialog für das Hinzufügen des Verweises benötigt mindestens die binäre Typbibliothek auf dem Entwicklungs-Rechner. Alternativ dazu kann man die COM Interop Wrapper-Assembly auch auf einem Rechner einmalig angelegen, auf dem die gewünschte Office-Version verfügbar ist, indem das NET Framework-Kommandozeilen-Tool <i>tlbimp.exe</i> bemüht wird. Das "richtige" Projekt bindet dann nur diese bereits fertige Wrapper-Assembly direkt ein.

        Der Unterschied zu Delphi liegt nur im Zeitpunkt des "Kompilierens". Während Delphi das auf dem Entwicklungs-Rechner gemacht hat, wird die .NET-Anwendung erst zur Laufzeit vom JIT-Compiler in nativen CPU-Anweisungen übersetzt. Daher benötigt der JITC die (sprachunabhängigen) Type-Informationen aller beteiligten Objekte

        Comment

        Working...
        X