Untitled

 avatar
unknown
plain_text
a month ago
4.7 kB
4
Indexable
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):
                # Setzt die Überschrift
                self.treeview.heading(self.treeview["columns"][i], text=column["header"])

                # Setzt die Spaltenbreite und Ausrichtung
                self.treeview.column(self.treeview["columns"][i], 
                                     width=column["width"], 
                                     anchor=self.get_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] if row[column_index] is not None else " " 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}")

    def get_anchor(self, alignment):
        """Konvertiert die Textausrichtung aus der Konfiguration in den passenden Anchor-Wert."""
        if alignment == "left":
            return "w"  # Westen (links ausgerichtet)
        elif alignment == "center":
            return "center"  # Zentriert
        elif alignment == "right":
            return "e"  # Osten (rechts ausgerichtet)
        return "w"  # Standardmäßig links ausgerichtet

if __name__ == "__main__":
    app = ExcelViewer()
    app.mainloop()
Leave a Comment