Wie man Winword-Textmarken anspringt und befüllt

Gute Links und Tutorials könnt ihr hier posten.
Antworten
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Es ist die Frage aufgetaucht, wie man mit Python eine Word-Datei öffnen, die darin enthaltenen Textmarken (Bookmarks) anspringt und dort einen frei definierbaren Text einfügen kann.

Das geht so:

Man erstellt sich eine Word-Datei (ein Dokument), die als Vorlage dient. In diesem Dokument setzt man die Textmarken an die Positionen, an denen man den Text hinschreiben möchte. Im Beispiel, weiter unten, habe ich das Dokument "dokument.doc" genannt. Und das Python-Modul muss für dieses Beispiel im selben Ordner wie das Dokument liegen.

Zur Anleitung habe ich mit WINK einen kleinen Film gemacht. Leider habe ich erst zu spät gemerkt, dass drei Bilder pro Sekunde doch zu wenig sind. Aber man kann, glaube ich, doch alles wichtige erkennen.

http://gerold.bcom.at/bilder/word_textm ... python.htm

Und hier ist der zugehörige Python-Quellcode:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import win32com
import win32com.client
import os
import os.path


filename = os.path.abspath("dokument.doc")

# Word-Application referenzieren
app = win32com.client.Dispatch("Word.Application") 

# Word sichtbar machen. Kann später weggelassen werden
app.Visible = True

# Quelldatei öffnen
doc = app.Documents.Open(filename)

# Die in der Quelldatei enthaltenen Textmarken (marke1, marke2 und marke3)
# anspringen und hinten dran einen Text schreiben
doc.Bookmarks("marke1").Range.InsertAfter("Hier ist Marke1")
doc.Bookmarks("marke2").Range.InsertAfter("Hier ist Marke2")
doc.Bookmarks("marke3").Range.InsertAfter("Hier ist Marke3")

# Neuen Dateinamen generieren und unter diesem Dateinamen das geänderte
# Dokument abspeichern
base, ext = os.path.splitext(filename)
new_filename = base + "_new" + ext
doc.SaveAs(new_filename)

# Das Dokument und Word schließen und die Referenzen vernichten. WICHTIG!
doc.Close()
del doc

app.Quit()
del app

# Fertig
print "Fertig"
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Gerold, ich danke Dir. :D Du hast mir sehr geholfen.
Auch noch mal für die Links vielen Dank.

Ich mach mich dann schon mal an die GUI.

Viele Grüße andy
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Hi Gerold,

ich schon wieder!

Möchte auch gern Kontrollkästchen-Formularfelder (Checkbox)
aktivieren. Hab´es geschafft diese zu selektieren.
Aber wie übergebe ich True?

Hier komme ich nicht weiter:

Code: Alles auswählen

doc = app.Documents.Open(filename)
# Selektieren der Checkbox funktioniert bereits:
doc.Bookmarks("Kontrollkästchen2").Select
# Aber wie kann ich d. Checkbox ankreuzen?
# doc.selection.Bookmarks = True???

doc.Bookmarks("marke2").Range.InsertAfter("Hier ist Marke2") 
doc.Bookmarks("marke3").Range.InsertAfter("Hier ist Marke3")
Danke andy
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Andy hat geschrieben:Aber wie übergebe ich True?
Hi Andy!

Kurz gesagt: Keine Ahnung.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Andy
User
Beiträge: 196
Registriert: Sonntag 1. Januar 2006, 20:12
Wohnort: aus dem hohen Norden....

Hi Leutz,

hab´s nun hinbekommen.
Da sich die ganzen VB-Codebeispiele irgendwie für mich nicht in Python umsetzen ließen, mach ich dass nun so:

Man kann einfach das Aktivieren der Checkbox in Word als Makro aufzeichnen, und dieses dann per Python ausführen.

Um an Gerolds Tutorial anzuknüpfen:

Code: Alles auswählen

doc.Bookmarks("marke1").Range.InsertAfter("Hier ist Marke1")
doc.Bookmarks("marke2").Range.InsertAfter("Hier ist Marke2") 
doc.Bookmarks("marke3").Range.InsertAfter("Hier ist Marke3")
app.Run('Makro1')
Vielleicht hat ja doch noch jemand eine etwas pythonische Lösung für die Checkboxen? 8) Obwohl ich denke, dass es so schon gut gelöst ist.

Gruss andy
gurke
User
Beiträge: 6
Registriert: Donnerstag 10. Mai 2007, 18:39
Wohnort: Berlin

sehr genial..! :D das hilft mir meilensteine weiter 8)
Antworten