WordTemplateProcessor/dotx_processor.py

109 lines
5.2 KiB
Python
Raw Normal View History

2024-08-30 08:44:21 +00:00
import os
import win32com.client as win32
# Benutzerdefinierte Eingaben
input_folder = input("Geben Sie den Pfad zum Eingabeordner ein: ").strip()
output_folder = input("Geben Sie den Pfad zum Ausgabeordner ein: ").strip()
replace_area = input("Wählen Sie den Bereich zum Ersetzen (Header, Footer, Text): ").strip().lower()
find_text = input("Geben Sie den Text ein, den Sie ersetzen möchten: ").strip()
replace_text = input("Geben Sie den neuen Text ein, der ersetzt werden soll: ").strip()
# Sicherstellen, dass der Ausgabeordner existiert
os.makedirs(output_folder, exist_ok=True)
# Word-Anwendung starten
word = win32.gencache.EnsureDispatch('Word.Application')
word.Visible = False # Word-Fenster im Hintergrund ausführen
# Durch alle .dotx-Dateien im Eingabeordner gehen
for filename in os.listdir(input_folder):
if filename.endswith('.dotx'): # Überprüfen, ob es sich um eine Word-Vorlage handelt
file_path = os.path.join(input_folder, filename)
print(f"Bearbeite Datei: {filename}")
try:
# Datei öffnen
doc = word.Documents.Open(file_path)
# Header, Footer oder Textbereich bearbeiten basierend auf Benutzerauswahl
if replace_area == 'footer':
sections = doc.Sections
parts = []
for section in sections:
parts.extend([
section.Footers(win32.constants.wdHeaderFooterPrimary),
section.Footers(win32.constants.wdHeaderFooterFirstPage),
section.Footers(win32.constants.wdHeaderFooterEvenPages)
])
elif replace_area == 'header':
sections = doc.Sections
parts = []
for section in sections:
parts.extend([
section.Headers(win32.constants.wdHeaderFooterPrimary),
section.Headers(win32.constants.wdHeaderFooterFirstPage),
section.Headers(win32.constants.wdHeaderFooterEvenPages)
])
elif replace_area == 'text':
parts = [doc.Content] # Verwenden Sie 'Content' für den Haupttextbereich
else:
print("Ungültige Auswahl. Bereich muss 'Header', 'Footer' oder 'Text' sein.")
doc.Close()
continue
for part in parts:
# Direkt auf das Range-Objekt zugreifen und Find- und Replace-Methoden anwenden
rng = part.Range if hasattr(part, 'Range') else part
# Find- und Replace-Objekt nutzen
find = rng.Find
find.Text = find_text
find.Replacement.Text = replace_text
find.Forward = True
find.Wrap = win32.constants.wdFindContinue
find.Format = False # Keine Formatierung ändern
find.MatchCase = False # Groß-/Kleinschreibung ignorieren
find.MatchWholeWord = False # Auch Teile von Wörtern ersetzen
find.Execute(Replace=win32.constants.wdReplaceAll)
# Überprüfung von Textfeldern innerhalb von Headern oder Footern
if replace_area in ['header', 'footer']:
for shape in part.Shapes:
if shape.TextFrame.HasText:
shape_rng = shape.TextFrame.TextRange
shape_find = shape_rng.Find
shape_find.Text = find_text
shape_find.Replacement.Text = replace_text
shape_find.Forward = True
shape_find.Wrap = win32.constants.wdFindContinue
shape_find.MatchCase = False
shape_find.Execute(Replace=win32.constants.wdReplaceAll)
# Überprüfung von Tabellen innerhalb des Range-Objekts
for table in rng.Tables:
for row in table.Rows:
for cell in row.Cells:
cell_find = cell.Range.Find
cell_find.Text = find_text
cell_find.Replacement.Text = replace_text
cell_find.Forward = True
cell_find.Wrap = win32.constants.wdFindContinue
cell_find.MatchCase = False
cell_find.Execute(Replace=win32.constants.wdReplaceAll)
# Geändertes Dokument speichern
output_path = os.path.join(output_folder, filename)
doc.SaveAs(output_path, FileFormat=win32.constants.wdFormatXMLTemplate)
doc.Close()
print(f"Bearbeitung von {filename} abgeschlossen.")
except Exception as e:
print(f"Fehler beim Verarbeiten der Datei {filename}: {e}")
if 'doc' in locals():
doc.Close()
# Word-Anwendung beenden
word.Quit()
print("Skript abgeschlossen.")