From 64f1a77548f595a5a8c19c1d45b292e22fdd95ee Mon Sep 17 00:00:00 2001 From: "tim.mueller" Date: Fri, 30 Aug 2024 08:44:21 +0000 Subject: [PATCH] added files --- dotx_processor.py | 108 +++++++++++++++++++++++++++++++++++++++++++ setup_environment.py | 43 +++++++++++++++++ 2 files changed, 151 insertions(+) create mode 100644 dotx_processor.py create mode 100644 setup_environment.py diff --git a/dotx_processor.py b/dotx_processor.py new file mode 100644 index 0000000..782359f --- /dev/null +++ b/dotx_processor.py @@ -0,0 +1,108 @@ +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.") diff --git a/setup_environment.py b/setup_environment.py new file mode 100644 index 0000000..a594f0c --- /dev/null +++ b/setup_environment.py @@ -0,0 +1,43 @@ +import os +import subprocess +import sys + +def run_command(command): + """Führt einen Shell-Befehl aus und gibt das Ergebnis zurück.""" + try: + subprocess.check_call(command, shell=True) + except subprocess.CalledProcessError as e: + print(f"Fehler beim Ausführen des Befehls: {e}") + +def ensure_pip(): + """Stellt sicher, dass pip installiert ist.""" + try: + import pip + print("pip ist bereits installiert.") + except ImportError: + print("pip nicht gefunden. Installiere pip...") + run_command("py -m ensurepip --upgrade") + run_command("py -m pip install --upgrade pip") + +def install_package(package): + """Installiert ein Python-Paket mit pip.""" + run_command(f"py -m pip install {package}") + +def setup_environment(): + """Überprüft und installiert die notwendigen Pakete.""" + ensure_pip() + + # Liste der erforderlichen Pakete + required_packages = ["pywin32"] + + for package in required_packages: + try: + __import__(package) + print(f"{package} ist bereits installiert.") + except ImportError: + print(f"{package} wird installiert...") + install_package(package) + print(f"{package} wurde erfolgreich installiert.") + +if __name__ == "__main__": + setup_environment()