Untitled
unknown
plain_text
10 months ago
4.1 kB
6
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):
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()Editor is loading...
Leave a Comment