Registriert seit: 16.08.2017
Version(en): 2010 & 2016
Guten Abend eure Diskusion hat mich auf eine neue Fährte gebracht.
Ich habe mit Hilfe von Cat Gpt ein python skript geschrieben das alle Informationen aus den xml eines Verzeichnisses mit Unterverzeichnissen herausliest und in eine Excel datei speichert.
Einziger Nachteil, das Skript kann nicht auf bereits geöffnete Dateien zugreifen
Grüße Rolf
hier das Skript
import os
import subprocess
import openpyxl
from openpyxl import Workbook
def check_file_locked(file_path):
"""Überprüft, ob die Datei gesperrt ist, indem versucht wird, sie zu öffnen."""
try:
with open(file_path, 'a'):
return False
except IOError:
return True
def prompt_user_to_close_application(file_path):
"""Aufforderung an den Benutzer, die Anwendung zu schließen, die auf die Datei zugreift."""
while check_file_locked(file_path):
print(f"Die Datei '{file_path}' wird von einer anderen Anwendung verwendet.")
print("Bitte schließen Sie die Datei und drücken Sie Enter, um es erneut zu versuchen.")
input()
def delete_existing_excel(file_path):
"""Löscht die bestehende Excel-Datei, nachdem der Benutzer sie entsperrt hat."""
while True:
try:
if os.path.exists(file_path):
os.remove(file_path)
print(f"Die bestehende Zieldatei '{file_path}' wurde erfolgreich gelöscht.")
break
except PermissionError:
print(f"Die Datei '{file_path}' wird von einer anderen Anwendung verwendet.")
print("Bitte schließen Sie die Anwendung, die auf die Datei zugreift, und drücken Sie Enter, um fortzufahren.")
input()
def run_script(script_path, script_name, inputs, use_stdin=False):
full_script_path = os.path.join(script_path, script_name)
try:
if use_stdin:
process = subprocess.Popen(
["python", full_script_path],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
stdout, stderr = process.communicate('\n'.join(inputs) + '\n')
if stdout:
print("Standardausgabe (stdout):", stdout)
if stderr:
print("Fehlerausgabe (stderr):", stderr)
else:
process = subprocess.Popen(
["python", full_script_path] + inputs,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
stdout, stderr = process.communicate()
if process.returncode == 0:
print(f"{script_name} wurde erfolgreich ausgeführt.")
else:
print(f"Fehler beim Ausführen von {script_name}. Rückgabecode: {process.returncode}")
print("Fehlerausgabe (stderr):", stderr)
except Exception as e:
print(f"Ein Fehler ist aufgetreten: {e}")
return stdout # Return the output to be written to Excel
def write_to_excel(filtered_data, file_path, sheet_name):
"""Schreibt die gefilterten Ausgabedaten in eine Excel-Datei mit Spalten für Excel-Datei und Gefundener Pfad."""
workbook = Workbook()
sheet = workbook.active
sheet.title = sheet_name
# Header hinzufügen
sheet.cell(row=1, column=1, value="Excel-Datei")
sheet.cell(row=1, column=2, value="Gefundener_Pfad")
for row_index, line in enumerate(filtered_data, start=2): # Startet bei Zeile 2 für die Daten
if "Excel-Datei:" in line and ", Gefundener Pfad:" in line:
# Extrahiert den Dateinamen und den Pfad
excel_datei = line.split("Excel-Datei: ")[1].split(", Gefundener Pfad:")[0].strip()
gefundener_pfad = line.split("Gefundener Pfad:")[1].strip()
# Schreibt die Daten in die jeweiligen Spalten
sheet.cell(row=row_index, column=1, value=excel_datei)
sheet.cell(row=row_index, column=2, value=gefundener_pfad)
workbook.save(file_path)
print(f"Die gefilterten Ergebnisse wurden in '{file_path}' im Blatt '{sheet_name}' gespeichert.")
def main():
# Benutzer nach Quelle und Ziel fragen
base_path = input("Bitte geben Sie den Pfad zum Quellverzeichnis mit den Excel-Dateien ein: ")
excel_file_name = input("Bitte geben Sie den Namen der Excel-Datei für die Ausgabe ein (ohne Endung .xlsx): ") + ".xlsx"
excel_file_path = os.path.join(base_path, excel_file_name)
scriptZip_path = os.path.join(base_path, "Python_script")
scriptZip_name = "import zipfile.py"
inputs_scriptZip = [
base_path,
"ExcelQuellen",
base_path
]
delete_existing_excel(excel_file_path)
# Script ausführen und Ergebnis erfassen
output_data = run_script(scriptZip_path, scriptZip_name, inputs_scriptZip, use_stdin=True)
# Ausgabe filtern, um nur Zeilen ohne die spezifischen Texte einzuschließen
filtered_data = [
line for line in output_data.splitlines()
if "Keine passenden Referenzen in sharedStrings.xml gefunden" not in line and
"sharedStrings.xml wurde nicht gefunden." not in line
]
# Gefilterte Ausgabe in die Excel-Datei schreiben
write_to_excel(filtered_data, excel_file_path, "excel_references")
if __name__ == "__main__":
main()