Sign in Join
Wiki copytemporary

Revision 2 of 2, by Wp on 9-11-2022. The page as it is now.

WordAutomation/de

https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Windows_logo_-_2012.svg/50px-Windows_logo_-_2012.svg.png

Dieser Artikel behandelt ausschließlich Windows.

Siehe auch: Multiplatform Programming Guide/de

│ Deutsch (de) │

Zurück zur Office Automation.

Word als OleObjekt

Word lässt sich wie alle MS Office Produkte automatisieren. Im Gegensatz zu den übrigen MS Office Produkten ist es bei der Automatisierung sehr sehr langsam und reagiert sehr ungewohnt.
Wenn man als Automatisierungsobjekt nicht zwingend auf MS Word angewiesen ist, dann sollte man für die Automatisierung MS Excel nehmen.
Wenn Sie Umlaute usw. verwenden, dann sollten Sie wissen, dass Word UTF16 codierte Strings verwendet.
Für die Oleautomation muss die Unit ComObj eingebunden werden.
Wenn Sie mit Umlauten usw. arbeiten dann brauchen Sie für das Stringcasting die Unit lclproc.

Beispiel:

pascal
unit
      ComObj, lclproc;

Speicherplatz für Word und Worddokument reservieren

pascal
var
      varWdApp: oleVariant;      // Reserviert Speicher für die Programmsteuerung
      varDokument: oleVariant;   // Reserviert Speicher für die Steuerung des Worddokuments

Wordsteuerung

Word OleObjekt erstellen

pascal
begin
      ...
      try
        varWdApp := CreateOleObject('Word.Application'); // erstellt das Wordobjekt
      except
        WriteLn('MS Word kann nicht gestartet werden.'); // Fehlerbehandlung
      end;
      ...
    end;

Word Version ermitteln

pascal
begin
      ...
      ShowMessage(varWdApp.Version);
      ...
    end;

Word beenden und Speicher freigeben

pascal
begin
      ...
      varWdApp.Quit;
      varWdApp := Unassigned;
      ...
    end;

Die Sichtbarkeit von Word steuern

Eine unsichtbare Anwendung verhindert während der Automatisierung das Flackern des Bildschirms.

pascal
begin
      ...
      varWdApp.Visible := False;  // macht Word unsichtbar
      varWdApp.Visible := True;   // macht Word sichtbar
      ...
    end;

Word Screenupdating (Bildschirmaktualisierung)

pascal
begin
      ...
      varWdApp.ScreenUpdating := False; // schaltet bei einem sichtbaren Word das Flackern des Bildschirms aus
                                        // und erhöht die Verarbeitungsgeschwindigkeit.
      varWdApp.ScreenUpdating := True;  // schaltet die Bildschirmaktualisierung wieder ein.
      ...
    end;

Sprache der Wordinstallation ermittlen

pascal
begin
      ...
      if varWdApp.System.Country <> wdGermany then ...  // prüft, ob die Wordinstallation nicht Deutsch ist.
      ...
    end;

Text des Dokuments bearbeiten

Neues Worddokument erstellen

pascal
begin
      ...
      varDokument := varWdApp.Documents.Add; // fügt ein neues 'leeres' Worddokument hinzu
      ...
    end;

Vorhandenes Worddokument öffnen

Es gibt mehrere Möglichkeiten ein Worddokument zu öffnen.

Beispiel 1:
Ein Worddokument mit mehreren Parametern öffnen
Alle Parameter außer Parameter 1 sind optional

  1. Parameter: Pfadname und Datename
  1. Parameter: False, wenn die Datei nicht in das aktuelle Wordformat konvertiert werden soll
  1. Parameter: True, wenn die Datei schreibgeschützt geöffnet werden soll
  1. Parameter: True, wenn der Name der Datei der Liste der zuletzt geöffneten Dateien hizugefügt werden soll
  1. Parameter: Das Kennwort (Passwort) zum öffnen der Vorlage
  1. Parameter:
  1. Parameter: Das Kennwort (Passwort) zum Speichern des Dokuments
  1. Parameter: Das Kennwort (Passwort) zum Speichern der Vorlage
  1. Parameter:
  1. Parameter: Das Dateikonvertierungsprogramm, das zum Öffnen des Dokuments verwendet werden soll. Der Standardwert ist wdOpenFormatAuto
pascal
begin
      ...
      varDokument :=  varWdApp.Documents.Open(FileName, EmptyParam, EmptyParam,
                          EmptyParam, EmptyParam, EmptyParam,
                          EmptyParam, EmptyParam, EmptyParam,
                          EmptyParam);
      ...
    end;

Beispiel 2:
Ein Worddokument mit einem Umlaut usw. im Dateinamen öffnen

pascal
begin
      ...
      varDokument := varWdApp.Documents.Open(UTF8ToUTF16('D:\Üben.doc')); // Öffnet ein Worddokument mit Umlauten usw. im Namen
      ...
    end;

Beispiel 3:

pascal
begin
      ...
      varDokument := varWdApp.Documents.Open(strPfad);        // öffnet ein Worddokument mit Hilfe einer Variablen
                                                              // (Pfad: maximal 255 Zeichen, Alphanumerisch)
      varDokument := varWdApp.Documents.Open('D:\Test.doc');  // öffnet ein Worddokument mit festem Pfad hinzu
      ...
    end;

Worddokument aktivieren

pascal
begin
      ...
      varDokument.Activate;  //aktiviert das Worddokument
      ...
    end;

Text Cursor setzen

pascal
begin
      ...
      varWdApp.Selection.EndKey(wdStory);       // Cursor bewegt sich zum Ende des Dokumentes
      varWdApp.Selection.HomeKey(wdStory);      // Cursor bewegt sich zum Anfang des Dokumentes
      varWdApp.Selection.MoveRight(wdWord);     // Cursor am Anfang des nächsten Wortes
      varWdApp.Selection.MoveLeft(wdCharacter); // Cursor wird um ein Zeichen nach Links versetzt
      varWdApp.Selection.Delete(wdCharacter);   // Löscht ein Zeichen rechts vom Cursor
      varWdApp.Selection.MoveDown(wdParagraph); // Cursor bewegt sich zum Anfang des nächsten Abschnitts
      ...
    end;

Text in ein Worddokument einfügen

pascal
begin
      ...
      varWdApp.Selection.TypeText(UTF8Decode('Neuer Text'));
      varWdApp.Selection.TypeText(UTF8Decode('Zusätzlicher Text')); // Benötigt die Unit lclproc für die korrekte
                                                                    // Umwandlung der Umlaute
    
      varWdApp.Selection.InsertAfter('Test');       // fügt im Worddokument nach der Cursorposition diesen Text ein
                                                    // die Cursorpsition befindet sich bei einem frisch geöffneten Worddokument
                                                    // immer am Anfang des Dokuments
    
      ...
    end;

Worddokument speichern

Beispiel 1:
Ein Worddokument ohne Besonderheiten im Namen speichern.

pascal
begin
      ...
      varDokument.SaveAs('D:\Test.doc'); // Speichert das Worddokument unter einem neuen Namen
      varDokument.Save;                  // Speichert das Worddokument unter seinem aktuellen Namen
      ...
    end;

Beispiel 2:
Ein Worddokment mit Umlaut im Namen speichern.

pascal
begin
      ...
      varDokument.SaveAs(UTF8ToUTF16('D:\Üben.doc')); // Speichert das Worddokument (mit Umlauten usw. im Namen)
                                                      // unter einem neuen Namen ab
      ...
    end;

Beispiel 3:
Ein Worddokument in einem anderen Datei-Format speichern.

pascal
const
      // Möglichkeiten wären u.a.
      // https://docs.microsoft.com/de-de/office/vba/api/word.wdsaveformat
      wdFormatDocument97 = 0;  // .doc format
      wdFormatRTF = 6;
      wdFormatHTML = 8;
      wdFormatXML = 11;
      wdFormatDocumentDefault = 16;  // .docx format
      wdFormatPDF = 17;
      wdFormatOpenDocumentText = 23;
    var
      FileFormat: OleVariant;    // Wichtig: das muss als OleVariant deklariert sein!
    begin
      FileFormat := wdFormatRTF;
      ADocument.SaveAs(FileName, FileFormat);
      ...

Worddokument schliessen und Speicher freigeben

pascal
begin
      ...
      varDokument.Close;         // Schliesst das Worddokument
      varDokument := Unassigned; // Gibt den Speicher für die Programmsteuerung frei
      ...
    end;

Worddokument Eigenschaften festlegen

Alle Eigenschaften des Worddokumentes können über ihren englischen Namen angesprochen werden.

pascal
begin
      ...
      varDokument.BuiltInDocumentProperties['Title'].Value := 'Testdokument';                 // fügt den Dokumententitel ein
      varDokument.BuiltInDocumentProperties['Subject'].Value := 'Testdokumente';              // fügt das Thema ein
      varDokument.BuiltInDocumentProperties['Author'].Value := 'Testuser';                    // fügt den Ersteller ein
      varDokument.BuiltInDocumentProperties['Manager'].Value := 'Testmanager';                // fügt den verantwortlichen Manager ein
      varDokument.BuiltInDocumentProperties['Company'].Value := 'Testfirma';                  // fügt die Firma ein
      varDokument.BuiltInDocumentProperties['Category'].Value := 'Automatisationsbeispiele';  // fügt die Kategorie ein
      varDokument.BuiltInDocumentProperties['Comments'].Value := 'Erstes Muster';             // fügt einen Kommentar ein
      ...
    end;

Absatz

Absatz ausrichten

pascal
begin
      ...
      varWdApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphright;  // Ausrichtung am rechten Dokumentrand
      varWdApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphLeft;   // Ausrichtung am linken Dokumentrand
      varWdApp.Selection.ParagraphFormat.Alignment := wdAlignParagraphCenter; // Ausrichtung in der Dokumentmitte
      ...
    end;

Absatz (Zeilenumbruch) einfügen

pascal
begin
      ...
      varWdApp.Selection.TypeParagraph; // fügt einen Zeilenumbruch (Absatz) ein
      // Alternative
      varWdApp.Selection.InsertAfter(String(#13));  // fügt einen Zeilenumbruch im Worddokument ein
      varWdApp.Selection.InsertAfter(String(#10));  // fügt einen Zeilenumbruch im Worddokument ein
      ...
    end;

Text formatieren

Der Text wird an der Cursorposition formatiert.

pascal
begin
      ...
      varWdApp.Selection.Font.Name   := 'Times New Roman'; // Schriftart
      varWdApp.Selection.Font.Size   := 12;                // Schriftgrösse
      varWdApp.Selection.Font.Bold   := True;              // Fettschrift
      varWdApp.Selection.Font.Italic := True;              // Kursivschrift
    
      varWdApp.Selection.Font.Name   := 'Arial';           // Schriftart
      varWdApp.Selection.Font.Size   := 11;                // Schriftgrösse
      varWdApp.Selection.Font.Bold   := False;             // keine Fettschrift
      varWdApp.Selection.Font.Italic := False;             // keine Kursivschrift
      ...
    end;

Bookmarks

Speicher für die Bookmarksteuerung reservieren

pascal
var
      varBookmark: oleVariant;   // Reserviert Speicher für die Steuerung der Bookmark

Variable initialisieren

pascal
begin
      ...
      // Fügt an der Stelle einer Bookmark (Textmarke / Markierung) einen Text ein
      varBookmark := varDokument.Bookmarks.Item(2);  // Auswahl der zu ersetzenden Bookmark (Markierung) über den Index
                                                     // in diesem Fall ist es die erste Bookmark
      // Alternative
      varBookmark := varDokument.Bookmarks.Item('Test2');  // Auswahl der zu ersetzenden Bookmark (Markierung) über ihren Namen
      ...
    end;

An die Anfangsposition der Bookmark schreiben

pascal
begin
      ...
      varBookmark.Range.Text := UTF8ToUTF16('Testeintrag für die Bookmark'); // damit wird an der Position der
                                                                             // Bookmark der Text eingefügt.
      ...
    end;

Bookmark löschen

pascal
begin
      ...
      // Löscht, die ausgewählte Bookmark und nicht den eingefügten Text
      varDokument.Bookmarks.Item(1).Delete;       // Löscht die Bookmark über einen Index
      // Alternative
      varDokument.Bookmarks.Item('Test1').Delete; // Löscht die Bookmark über ihren Namen
      ...
    end;

Variable für Bookmarksteuerung freigeben

pascal
begin
      ...
      varBookmark := Unassigned;
      ...
    end;

Prüfen, ob eine bestimmte Bookmark vorhanden ist

pascal
begin
      ...
      if varDokument.Bookmarks.Exists('Text1') then ... ;  //Prüft, ob eine Bookmark vorhanden ist
      ...
    end;

Bookmarks zählen

pascal
var
      intAnz: Integer;
    begin
      ...
      intAnz := varDokument.Bookmarks.Count;
      ...
    end;

Formularfelder

In ein Formularfeld schreiben

pascal
begin
      ...
      varWdApp.ActiveDocument.FormFields.Item('Text1').Result := 'Versuch'; // schreibt in ein Formularfeld
      varWdApp.ActiveDocument.FormFields.Item('Text1').Result := ''; // leert ein Formularfeld
      ...

Ein Formularfeld auslesen

pascal
var
      strText: String;
    begin
      ...
      strText := varWdApp.ActiveDocument.FormFields.Item('Text2').Result; // liest ein Formularfeld aus
      ...
    end;

Tabellen

Speicher für die Tabellensteuerung reservieren

pascal
var
      varTabelle: oleVariant;

Arbeiten mit neuen Tabellen

Variable initialisieren und Tabelle anlegen

pascal
begin
      ...
      varTabelle := varDokument.Tables.Add(varWdApp.Selection.Range, 5, 3);
      ...
    end;

Die neu angelegte Tabelle füllen

pascal
begin
      ...
      varTabelle.Cell(1, 1).Range.Text := 'Januar';
      varTabelle.Cell(1, 2).Range.Text := 'Februar';
      varTabelle.Cell(1, 3).Range.Text := UTF8ToUTF16('März');
      ...
    end;

Arbeiten mit vorhandenen Tabellen

pascal
var
      intAnz: Integer;
    begin
      ...
      varDokument.Tables.Item(1).Cell(2, 2).Range.Text:='Hallo'; // fügt in einen Wert in eine Zelle ein
      varDokument.Tables.Item(1).Rows.Add();  // fügt am Ende der Tabelle eine Zeile an
      intAnz:=varDokument.Tables.Item(1).Rows.Count;  // ermittelt die Anzahl der Zeilen
      ...
    end;

Tabellenvariable wieder freigeben

pascal
begin
      ...
      varTabelle := Unassigned;
      ...
    end;

Auszug aus den Wordkonstanten

pascal
unit uWdConst;
    
    interface
    
    const
    // Klasse WdGoToItem
    wdGoToBookmark = -1;
    wdGoToComment = 6;
    wdGoToEndnote = 5;
    wdGoToEquation = 10;
    wdGoToField = 7;
    wdGoToFootnote = 4;
    wdGoToGrammaticalError = 14;
    wdGoToGraphic = 8;
    wdGoToHeading = 11;
    wdGoToLine = 3;
    wdGoToObject = 9;
    wdGoToPage = 1;
    wdGoToPercent = 12;
    wdGoToProofreadingError = 15;
    wdGoToSection = 0;
    wdGoToSpellingError = 13;
    wdGoToTable = 2;
    
    // Klasse wdParagraphAlignment
    wdAlignParagraphCenter = 1;
    wdAlignParagraphDistribute = 4;
    wdAlignParagraphJustify = 3;
    wdAlignParagraphJustifyHi = 7;
    wdAlignParagraphJustifyLow = 8;
    wdAlignParagraphJustifyMed = 5;
    wdAlignParagraphLeft = 0;
    wdAlignParagraphRight = 2;
    wdAlignParagraphThaiJustify = 9;
    
    //Klasse wdRowAlignment
    wdAlignRowCenter = 1;
    wdAlignRowLeft = 0;
    wdAlignRowRight = 2;
    
    // Klasse wdOpenFormat
    wdOpenFormatAllWord = 6;
    wdOpenFormatAuto = 0;
    wdOpenFormatDocument = 1;
    wdOpenFormatEncodedText = 5;
    wdOpenFormatRTF = 3;
    wdOpenFormatTemplate = 2;
    wdOpenFormatText = 4;
    wdOpenFormatUnicodeText = 5;
    wdOpenFormatWebPages = 7;
    wdOpenFormatXML = 8;
    
    // Klasse WdSaveOptions
    wdDoNotSaveChanges = 0;
    wdPromptToSaveChanges = -2;
    wdSaveChanges = -1;
    
    // Klasse WdCountry
    wdArgentina = 54;
    wdBrazil = 55;
    wdCanada = 2;
    wdChile = 56;
    wdChina = 86;
    wdDenmark = 45;
    wdFinland = 358;
    wdFrance = 33;
    wdGermany = 49;
    wdIceland = 345;
    wdItaly = 39;
    wdJapan = 81;
    wdKorea = 82;
    wdLatinAmerica = 3;
    wdMexico = 52;
    wdNetherlands = 31;
    wdNorway = 47;
    wdPeru = 51;
    wdSpain = 34;
    wdSweden = 46;
    wdTaiwan = 886;
    wdUK = 44;
    wdUS = 1;
    wdVenezuela = 58;
    
    // Klasse WdUnits
    wdCell = 12;
    wdCharacter = 1;
    wdCharacterFormatting = 13;
    wdColumn = 9;
    wdItem = 16;
    wdLine = 5;
    wdParagraph = 4;
    wdParagraphFormatting = 14;
    wdRow = 10;
    wdScreen = 7;
    wdSection = 8;
    wdSentence = 3;
    wdStory = 6;
    wdTable = 15;
    wdWindow = 11;
    wdWord = 2;
    
    implementation
    
    end.

From the Free Pascal wiki, page "WordAutomation/de", as the Internet Archive kept it on 2025-03-20, last changed on 2022-09-12. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.