FAQ 0015: Wie kann ich ein Office-Dokument in meiner Anwendung verwenden?
von Helge Rex
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
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
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
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
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
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
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
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.