Untitled
import tkinter as tk from tkinter import filedialog, messagebox from tkinter import ttk from openpyxl import load_workbook import os import json CONFIG_FILE = "config.json" class ExcelViewer(tk.Tk): def __init__(self): super().__init__() self.title("Excel Viewer") self.treeview = ttk.Treeview(self, selectmode="browse") self.treeview.pack(fill="both", expand=True) self.columns = [] self.load_config() self.create_menu() def create_menu(self): menu = tk.Menu(self) self.config(menu=menu) menu.add_command(label="Datei auswählen", command=self.select_file) def save_config(self): """Speichert den Dateipfad und die Header mit den Werten der Spalten in einer JSON-Datei.""" config = { "file_path": self.file_path, "columns": self.columns } with open(CONFIG_FILE, "w") as f: json.dump(config, f, indent=4) def load_config(self): """Lädt den Dateipfad und die Header mit den Werten der Spalten aus der JSON-Datei.""" if os.path.exists(CONFIG_FILE): with open(CONFIG_FILE, "r") as f: config = json.load(f) self.file_path = config.get("file_path") self.columns = config.get("columns", []) if self.file_path and self.columns: self.load_excel_data(self.file_path) def select_file(self): """Öffnet den Datei-Dialog zum Auswählen der Excel-Datei.""" self.file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx")]) if self.file_path: self.save_config() # Speichert den Pfad der Excel-Datei self.load_excel_data(self.file_path) def load_excel_data(self, file_path): """Lädt Daten aus der Excel-Datei und zeigt sie im Treeview.""" try: workbook = load_workbook(file_path) sheet = workbook.active # Daten löschen for col in self.treeview["columns"]: self.treeview.heading(col, text="") self.treeview.delete(*self.treeview.get_children()) # Wenn keine Spalten in der Config gespeichert sind, verwenden wir die erste Zeile aus der Excel-Datei if not self.columns: # Header aus der ersten Zeile der Excel-Datei holen self.columns = [ {"header": cell.value, "alignment": "center", "width": 10} for cell in next(sheet.iter_rows()) ] self.save_config() # Speichert die Header in der Config # Treeview konfigurieren self.treeview["columns"] = [col["header"] for col in self.columns] for i, column in enumerate(self.columns): self.treeview.heading(self.treeview["columns"][i], text=column["header"]) self.treeview.column(self.treeview["columns"][i], width=column["width"], anchor=column["alignment"]) # Spaltenüberschriften aus der Excel-Tabelle holen headers = [cell.value for cell in next(sheet.iter_rows())] # Für jede Spalte in der Konfiguration: Werte unter dem Header einfügen rows = [] for column in self.columns: column_index = headers.index(column["header"]) column_values = [row[column_index] for row in sheet.iter_rows(min_row=2, values_only=True)] rows.append(column_values) # Alle Zeilen ins Treeview einfügen for i in range(len(rows[0])): row_data = [rows[col][i] for col in range(len(rows))] self.treeview.insert("", "end", values=row_data) # Spaltenwerte in der Config speichern (nur Header, keine Daten) self.save_config() except Exception as e: messagebox.showerror("Fehler", f"Konnte Datei nicht laden: {e}") if __name__ == "__main__": app = ExcelViewer() app.mainloop()
Leave a Comment