none
Verweise "lokal" ablegen RRS feed

  • Frage

  • Hallo Meister(innen),

    in meinem aktuellen Projekt benutze ich Verweise auf Microsoft Excel. Dies ist ausdrücklich von Nöten, weil die Nutzer, meine Kollegen, unbedingt Daten nach Excel "exportieren" wollen. Manch Rechner ist mit der Office 2003, andere mit der Office 2007 ausgestattet. Meine Frage ist, wie man beide Verweise (Microsoft Excel 12.0 Object Library und Microsoft Excel 11.0 Object Library) lokal im Projekt ablegt, so dass sie immer zur Verfügung stehen? Kann man auch abfragen, welche Office-Version installiert ist? Tausend Dank im Voraus für Eure Hilfe!

    Gruß
    mjanz
    Montag, 25. Januar 2010 20:05

Antworten

  • Hallo Marcus,

    hier mal ein schnell geschriebenes Beispiel:

    Imports Excel = Microsoft.Office.Interop.Excel
    Imports System.Runtime.InteropServices
    
    Public Class OfficeInfo
      Public Enum OfficeVersion
        NotInstalled
        Office11 = 11
        Office12 = 12
      End Enum
    
      Public Shared Function GetExcelVersion() As OfficeVersion
        Try
          Dim lXl As New Excel.Application()
          Dim lVersion As String
    
          lVersion = lXl.Version
          lXl.Quit()
    
          Marshal.ReleaseComObject(lXl)
          GC.Collect()
          GC.WaitForPendingFinalizers()
    
          Select Case lVersion
            Case "11.0"
              Return OfficeVersion.Office11
    
            Case "12.0"
              Return OfficeVersion.Office12
    
          End Select
    
        Catch ex As Exception
          Return OfficeVersion.NotInstalled
    
        End Try
      End Function
    
    End Class
    
    Public Class Form1
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(OfficeInfo.GetExcelVersion().ToString())
      End Sub
    End Class

    Setzt voraus, dass der Verweis auf das Excel Interop Assembly gesetzt ist. Dabei wird jeweils eine neue Excel Instanz gestartet, was einen gewissen Overhead darstellt, was bei dieser Lösung zu beachten wäre. Alternative wäre das Abfragen der Registry in HKLM\Software\Microsoft\Office finden sich für jede Version separate Verzeichnisse. Mir ist aber spontan keine Lösung bekannt hieraus die aktuell installierte bzw. aktive Office Installation zu ermitteln.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert mjanz Mittwoch, 27. Januar 2010 19:49
    Montag, 25. Januar 2010 21:46

Alle Antworten

  • Hallo,

    wenn Du keine neuen Funktionen von Office 2007 benötigst, kannst Du mit den Office 2003 PIAs auch Office/Excel 2007 automatisieren. Selbst der umgekehrte Weg wäre möglich, ist aber nicht supported.

    Feststellen, welche Version installiert ist, kannst Du am einfachsten, indem Du eine Excel.Application Instanz erstellst und die Version Eigenschaft abfragst. Kann keine Instanz erstellt werden, ist Excel vermutlich nicht (richtig) installiert.
    Thorsten Dörfler
    Microsoft MVP Visual Basic
    Montag, 25. Januar 2010 20:27
  • Hallo Thorsten,

    klingt vernünftig. Aber wie frage ich die Version ab? Hast Du sowas wie einen Codeschnipsel? Danke im Voraus für Deine Hilfe!

    Gruß
    Marcus
    Montag, 25. Januar 2010 21:06
  • Hallo Marcus,

    hier mal ein schnell geschriebenes Beispiel:

    Imports Excel = Microsoft.Office.Interop.Excel
    Imports System.Runtime.InteropServices
    
    Public Class OfficeInfo
      Public Enum OfficeVersion
        NotInstalled
        Office11 = 11
        Office12 = 12
      End Enum
    
      Public Shared Function GetExcelVersion() As OfficeVersion
        Try
          Dim lXl As New Excel.Application()
          Dim lVersion As String
    
          lVersion = lXl.Version
          lXl.Quit()
    
          Marshal.ReleaseComObject(lXl)
          GC.Collect()
          GC.WaitForPendingFinalizers()
    
          Select Case lVersion
            Case "11.0"
              Return OfficeVersion.Office11
    
            Case "12.0"
              Return OfficeVersion.Office12
    
          End Select
    
        Catch ex As Exception
          Return OfficeVersion.NotInstalled
    
        End Try
      End Function
    
    End Class
    
    Public Class Form1
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        MsgBox(OfficeInfo.GetExcelVersion().ToString())
      End Sub
    End Class

    Setzt voraus, dass der Verweis auf das Excel Interop Assembly gesetzt ist. Dabei wird jeweils eine neue Excel Instanz gestartet, was einen gewissen Overhead darstellt, was bei dieser Lösung zu beachten wäre. Alternative wäre das Abfragen der Registry in HKLM\Software\Microsoft\Office finden sich für jede Version separate Verzeichnisse. Mir ist aber spontan keine Lösung bekannt hieraus die aktuell installierte bzw. aktive Office Installation zu ermitteln.

    Thorsten Dörfler
    Microsoft MVP Visual Basic
    • Als Antwort markiert mjanz Mittwoch, 27. Januar 2010 19:49
    Montag, 25. Januar 2010 21:46
  • Wow,

    tausend Dank! Das hätte ich so nicht hinbekommen. Hätte ich doch bloß Informatik studiert...!

    Gruß
    Marcus
    Mittwoch, 27. Januar 2010 19:51