Die Community zu .NET und Classic VB.
Menü

FAQ 0015: Wie kann ich ein Office-Dokument in meiner Anwendung verwenden?

 von 

Frage 

Wie kann ich ein Office-Dokument in meiner Anwendung verwenden?

Informationen  

Es gibt mehrere Möglichkeiten, wie man Office fernsteuern kann.
Der hier gezeigte Quellcode behandelt die Möglichkeiten "early binding" (Verweise einbinden) und "late binding" (Object verwenden).
Bei der Methode "early binding" wird unter "Projekt" -> "Verweise" ein Verweis auf die entsprechende Bibliothek gesetzt. Das kann aber zu Problemen führen, wenn auf dem Entwicklungsrechner eine andere Office-Version installiert ist als auf dem Rechner, auf dem die Anwendung später laufen soll. Dafür läuft der Zugriff auf Office schneller.
Im Gegensatz dazu wird bei "late binding" kein Verweis gesetzt, die Objekt-Variablen werden als Datentyp Object deklariert. Hier tauscht man Geschwindigkeit gegen Kompatibilität (es ist fast egal, ob Word 97 oder Word XP installiert ist).

Wenn man eine Anwendung entwickelt, welche mit Office-Dokumenten arbeiten soll, sollte man "early binding" verwenden. In diesem Fall kann einem IntelliSense zusätzliche Informationen wie verfügbare Funktionen und Eigenschaften anbieten.
Bevor die Anwendung aber kompiliert und ausgeliefert wird, sollte man auf "late binding" umstellen.
Kleiner Tipp am Rande: Compiler-Flags sind eine hervorragende Möglichkeit, um so etwas schnell umzustellen (Hilfe zu "#Const" anschauen!).

Wem das zu kompliziert oder zu viel Aufwand ist, der sollte sich die Möglichkeiten des OLE-Steuerelements anschauen.

Nachtrag von Florian Rittmeier:
Die unten stehenden Methoden setzen voraus, daß Microsoft Word bzw. Microsoft Excel auf dem jeweiligen Rechner installiert ist. Wer hingegen nur einfache Excel-Dokumente erstellen möchte, welche man später in Excel weiterverarbeiten kann, dem sei zu einer Klasse von Paul Squires geraten, welche das "Excel BIFF 2.1 Spreadsheet"-Format erzeugen und auslesen kann. Dieses Format ist ein älteres Excelformat, welches nur einfache Formatierungen erlaubt. Die Dokumente können aber ohne jegliche Konverter auch von aktuellen Excel-Versionen geöffnet werden und haben die bekannte Dateiendung "xls".
Die Klasse kann man von http://www.wotsit.org herunterladen. Das Archiv von Paul Squires mit der Klasse findet man, wenn man nach "XLS" sucht.

Nachtrag von Florian Rittmeier:
Nach http://support.microsoft.com/kb/306682/en-us/ (Link nicht mehr erreichbar) muss bei Verwendung einer .NET-Sprache zum Ansprechen von Office per Automatisierung vor dem Setzen einer Objektreferenz eines Objektes theOfficeObject auf Nothing zunächst System.Runtime.InteropServices.Marshal.ReleaseComObject (theOfficeObject) aufgerufen werden, da nur so sichergestellt werden kann, daß die Referenz auf das zugrunde liegene COM-Objekt zum richtigen Zeitpunkt gelöst/dekrementiert wird.

Word mit VB5/VB6  

Der folgende Code zeigt, wie man ein Word-Dokument mit VB5/VB6 verarbeitet.

'   Dieses Beispiel zeigt, wie man die Object Library benutzt 
'   (early binding). Möchte man "late binding" verwenden, stehen die 
'   Werte und Datentypen als Kommentar dabei.

'   Ein paar Variablen
Dim wrdApp As Word.Application      '   As Object
Dim boolAppLoad As Boolean
Dim wrdDoc As Word.Document         '   As Object
Dim boolDocLoad As Boolean
Dim strFile As String

'   Fehlerbehandlungsverhalten setzen
On Error Resume Next

'   Alte Fehler löschen
Err.Clear

'   Datei benennen
strFile = "C:\My Files\Tabellen.doc"

'   Word referenzieren
Set wrdApp = GetObject(, "Word.Application")

'   Ist ein Fehler aufgetreten (Word war dann nicht geladen)?
If (Err.Number <> 0) Then
    '   Fehler löschen
    Err.Clear
    
    '   Word war nicht geladen
    boolAppLoad = True
    
    '   Word jetzt starten
    Set wrdApp = CreateObject("Word.Application")
Else
    '   Word war geladen
    boolAppLoad = False
End If

'   Dokument referenzieren
Set wrdDoc = wrdApp.Documents.Item(strFile)

'   Ist ein Fehler aufgetreten (Dokument war dann nicht geöffnet)?
If (Err.Number <> 0) Then
    '   Fehler löschen
    Err.Clear
    
    '   Dokument war nicht geöffnet
    boolDocLoad = True
    
    '   Dokument öffnen
    Set wrdDoc = wrdApp.Documents.Open(strFile, , , False)
Else
    '   Dokument war geöffnet
    boolDocLoad = False
End If
    
'   Hier jetzt die Verarbeitung
[...]

'   Mußte das Dokument geladen werden?
If (boolDocLoad) Then
    '   Ja, Dokument speichern schließen
    wrdDoc.Close wdSaveChanges  '   wdSaveChanges = -1
End If

'   Referenz entfernen
Set wrdDoc = Nothing

'   Mußte Word geladen werden?
If (boolAppLoad) Then
    '   Ja, Word beenden
    wrdApp.Quit wdDoNotSaveChanges  '   wdDoNotSaveChanges = 0
End If

'   Referenz entfernen
Set wrdApp = Nothing

Listing 1: Word-Dokumente benutzen

Um Word-Dokumente zu schließen, ohne sie zu speichern und ohne eine Meldung zu erhalten, kann man folgenden Weg gehen:

wrdDoc.Saved = True
wrdDoc.Close wdDoNotSaveChanges

Listing 2: Word-Dokument schließen ohne zu speichern

Excel mit VB5/VB6  

Bei Microsoft Excel sieht der Quelltext etwas anders aus:

'   Dieses Beispiel zeigt, wie man die Object Library benutzt 
'   (early binding). Möchte man "late binding" verwenden, stehen die 
'   Werte und Datentypen dabei.

'   Ein paar Variablen
Dim xclApp As Excel.Application     '   As Object
Dim boolAppLoad As Boolean
Dim xclWbk As Excel.Workbook        '   As Object
Dim boolWbkLoad As Boolean
Dim xclSht As Excel.Worksheet       '   As Object
Dim strFile As String

'   Fehlerbehandlungsverhalten setzen
On Error Resume Next

'   Alte Fehler löschen
Err.Clear

'   Datei benennen
strFile = "C:\My Files\zeit.xls"

'   Excel referenzieren
Set xclApp = GetObject(, "Excel.Application")

'   Ist ein Fehler aufgetreten (Excel war dann nicht geladen)?
If (Err.Number <> 0) Then
    '   Fehler löschen
    Err.Clear
    
    '   Excel war nicht geladen
    boolAppLoad = True
    
    '   Excel jetzt starten
    Set xclApp = CreateObject("Excel.Application")
Else
    '   Excel war geladen
    boolAppLoad = False
End If

'   Workbook referenzieren
Set xclWbk = xclApp.Workbooks.Item(strFile)

'   Ist ein Fehler aufgetreten (Workbook war dann nicht geöffnet)?
If (Err.Number <> 0) Then
    '   Fehler löschen
    Err.Clear
    
    '   Workbook war nicht geöffnet
    boolWbkLoad = True
    
    '   Workbook öffnen
    Set xclWbk = xclApp.Workbooks.Open(strFile, _
                                , , , , , , , , , , , False)
Else
    '   Workbook war geöffnet
    boolWbkLoad = False
End If
    
'   Erste Tabelle referenzieren
Set xclSht = xclWbk.Worksheets(1)

'   Hier jetzt die Verarbeitung
[...]

'   Referenz entfernen
Set xclSht = Nothing

'   Mußte das Workbook geladen werden?
If (boolWbkLoad) Then
    '   Ja, Workbook speichern schließen
    xclWbk.Close xlSaveChanges  '   xlSaveChanges = 1
End If

'   Referenz entfernen
Set xclWbk = Nothing

'   Mußte Excel geladen werden?
If (boolAppLoad) Then
    '   Ja, Excel beenden
    xclApp.Quit
End If

'   Referenz entfernen
Set xclApp = Nothing

Listing 3: Excel-Dokumente benutzen

Excel ist recht geschwätzig und verlangt oft, daß Aktionen vom Benutzer bestätigt werden. Um diese Meldungen zu unterdrücken, gibt es die Eigenschaft DisplayAlerts.

xclApp.DisplayAlerts = False

Listing 4: Meldungen abschalten

Die Geschwindigkeit der Verarbeitung eines Excel-Sheets kann man steigern, indem man auf das Verarbeiten der Excel-Ereignisse verzichtet. Dazu setzt man die Eigenschaft EnableEvents entsprechend.

xclApp.EnableEvents = False

Listing 5: Ereignisse abschalten

Um Excel-Arbeitsmappen zu schließen, ohne sie zu speichern und ohne eine Meldung zu erhalten, kann man folgenden Weg gehen:

xclWbk.Saved = True
xclWbk.Close SaveChanges:=False

Listing 6: Excel-Arbeitsmappe schließen ohne zu speichern

Excel mit VB.NET  

Einer unserer Nutzer hat ein Beispiel eingesandt, in dem gezeigt wird, wie man aus .NET heraus mit Excel arbeiten kann.

'Mit diesem Tipp ist es möglich eine Instanz von Excel zu erstellen.
'Um dann eine Excel-Datei zu laden und zu bearbeiten.
'Es werden eine Form und zwei Buttons benötigt.
'Desweitern muß Excel instaliert sein
'Unter Project->Verweise hinzufügen...->
'COM "Microsoft Excel 10 Object Library 1.4" einbinden
Public Class Form1
    'Instanz von Excel erstellen
    Dim objXls As New Excel.Application
    
    'Der Pfad zu einer gewünschten Excel Datei
    Dim path As String = "D:\Daten\VB8\VB8-Excel\test.xls"

    'Instanz für ein Excelsheet erstellen
    Dim xlsWS As New Excel.Worksheet

    Private Sub Button1_Click( _
                ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles Button1.Click
        'Die Testdatei zu öffnen
        objXls.Workbooks.Open("D:\Daten\VB8\VB8-Excel\test.xls")
        
        'Excel sichtbar machen
        objXls.Visible = True
        
        'Das aktive Sheet setzen
        xlsWS = objXls.ActiveSheet
        
        'Und in A1 was eintragen
        xlsWS.Range("a1").Value = "ActiveVB"
        
        'Das ist Luxus
        Me.Button1.Enabled = False
        Me.Button2.Enabled = True
    End Sub
    
    Private Sub Button2_Click( _
                ByVal sender As System.Object, _
                ByVal e As System.EventArgs) Handles Button2.Click
        'Warnmeldungen ausschalten
        objXls.DisplayAlerts = False
        
        'Excel Beenden
        objXls.Quit()
        
        'Und Programm Beenden
        Me.Dispose()
    End Sub
End Class

Listing 7: Excel mit VB.NET steuern

Ein weiteres Beispiel für .NET und Excel findet sich in der Microsoft Knowledge Base: MSKB 301982: How to automate Microsoft Excel from Visual Basic .NET. (Link nicht mehr erreichbar)

Ihre Meinung  

Falls Sie Fragen zu dieser FAQ haben, Ihre Erfahrung mit anderen Nutzern austauschen möchten oder auf eine Ergänzung hinweisen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.