#!/usr/bin/env python3 """ Extrahiert alle 5 Kredite mit vollständigen Daten. """ import openpyxl import json from datetime import datetime # Excel-Datei laden datei = "Kopie von Kostenrechnung der Nächsten jahre (3).xlsx" print(f"Lade {datei}...") wb = openpyxl.load_workbook(datei, data_only=True) # Sheet "Tilgung bei Gleichbleibenden Be" laden sheet_name = "Tilgung bei Gleichbleibenden Be" ws = wb[sheet_name] # Kredit-Definitionen kredite = { "Targo Bank": {"col_base": 2}, # Spalte 2 = Restschuld, 3=Tilgung, 4=Zinsen "Köpke": {"col_base": 6}, # Spalte 6 = Restschuld, 7=Tilgung "DSL Bank": {"col_base": 9}, # Spalte 9 = Restschuld, 10=Tilgung, 11=Zinsen "PSD Nord": {"col_base": 13}, # Spalte 13 = Restschuld, 14=Tilgung, 15=Zinsen "Zingelstr. 14": {"col_base": 20}, # Spalte 20 = Restschuld, 21=Rate, 22=Zinsen } # Meine 5 Ziel-Kredite target_kredite = ["DSL Bank", "PSD Nord", "Zingelstr. 14", "PVCreditplus", "Sparkasse"] # Für Zingelstr. 14 müssen wir nach Sparkasse suchen (die haben beide Zingelstr. 14) # Zingelstr. 14 DSL und Zingelstr. 14 Sparkasse sind wahrscheinlich unter "Zingelstr. 14" zusammen print("\n=== DATENEXTRAKTION FUER 5 KREDITE ===\n") def get_last_value(ws, col, start_row=6): """Holt den letzten numerischen Wert aus einer Spalte""" for row in range(ws.max_row, start_row-1, -1): val = ws.cell(row=row, column=col).value if val is not None and isinstance(val, (int, float)) and val != 0: return val, row return None, None def get_first_date(ws, col=1, start_row=6): """Holt das erste Datum aus Spalte 1 (Monat)""" val = ws.cell(row=start_row, column=col).value if val and isinstance(val, datetime): return val return None def get_monthly_rate(ws, tilgung_col, start_row=6): """Ermittelt die monatliche Rate (häufigster Tilgungswert)""" rates = [] for row in range(start_row, min(start_row + 24, ws.max_row)): val = ws.cell(row=row, column=tilgung_col).value if val and isinstance(val, (int, float)) and val > 0: rates.append(val) if rates: from collections import Counter return Counter(rates).most_common(1)[0][0] return 0 def get_zinssatz_from_berechnung(ws, zinsen_col, restschuld_col, start_row=6): """Berechnet Zinssatz aus Zinsen/Restschuld * 12""" for row in range(start_row, min(start_row + 5, ws.max_row)): zinsen = ws.cell(row=row, column=zinsen_col).value restschuld = ws.cell(row=row, column=restschuld_col).value if zinsen and restschuld and isinstance(zinsen, (int, float)) and isinstance(restschuld, (int, float)) and restschuld > 0: zinssatz = (zinsen / restschuld) * 12 * 100 # Jahreszins in % if 0 < zinssatz < 20: # Plausibilitätscheck return round(zinssatz, 2) return None # DSL Bank print("1. DSL BANK") print("-" * 40) col_base = 9 restschuld_col = col_base tilgung_col = col_base + 1 zinsen_col = col_base + 2 restschuld, last_row = get_last_value(ws, restschuld_col) start_datum = get_first_date(ws) monatsrate = get_monthly_rate(ws, tilgung_col) zinssatz = get_zinssatz_from_berechnung(ws, zinsen_col, restschuld_col) print(f" Restschuld: {restschuld:,.2f} EUR") print(f" Monatsrate: {monatsrate:,.2f} EUR") print(f" Zinssatz: {zinssatz}% (berechnet)") print(f" Startdatum: {start_datum}") print(f" Letzte Zeile mit Daten: {last_row}") # PSD Nord print("\n2. PSD NORD") print("-" * 40) col_base = 13 restschuld_col = col_base tilgung_col = col_base + 1 zinsen_col = col_base + 2 restschuld, last_row = get_last_value(ws, restschuld_col) monatsrate = get_monthly_rate(ws, tilgung_col) zinssatz = get_zinssatz_from_berechnung(ws, zinsen_col, restschuld_col) print(f" Restschuld: {restschuld:,.2f} EUR") print(f" Monatsrate: {monatsrate:,.2f} EUR") print(f" Zinssatz: {zinssatz}% (berechnet)") print(f" Startdatum: {start_datum}") # Zingelstr. 14 (kombiniert DSL + Sparkasse?) print("\n3. ZINGELSTR. 14 (Gesamt)") print("-" * 40) col_base = 20 restschuld_col = col_base rate_col = col_base + 1 zinsen_col = col_base + 2 restschuld, last_row = get_last_value(ws, restschuld_col) monatsrate = get_monthly_rate(ws, rate_col) zinssatz = get_zinssatz_from_berechnung(ws, zinsen_col, restschuld_col) print(f" Restschuld: {restschuld:,.2f} EUR") print(f" Monatsrate: {monatsrate:,.2f} EUR") print(f" Zinssatz: {zinssatz}% (berechnet)") print(f" Startdatum: {start_datum}") # Zeige einige Zeilen der Zingelstr. 14 Spalten print("\n Erste 5 Tilgungszeilen für Zingelstr. 14:") for row in range(6, 11): monat = ws.cell(row=row, column=1).value rest = ws.cell(row=row, column=20).value rate = ws.cell(row=row, column=21).value zins = ws.cell(row=row, column=22).value print(f" {row}: Monat={monat}, Rest={rest}, Rate={rate}, Zins={zins}") print("\n4. SUCHE NACH PVCreditplus...") print("-" * 40) # Suche nach PVCreditplus in Zeile 1 pvc_col = None for col in range(1, ws.max_column + 1): val = ws.cell(row=1, column=col).value if val and "pvc" in str(val).lower(): pvc_col = col print(f" GEFUNDEN in Spalte {col}: {val}") break if not pvc_col: print(" PVCreditplus nicht im Sheet 'Tilgung bei Gleichbleibenden Be' gefunden!") print(" Suche in anderen Sheets...") for sheet_name in wb.sheetnames: print(f" Checking {sheet_name}...") temp_ws = wb[sheet_name] for row in range(1, min(5, temp_ws.max_row + 1)): for col in range(1, min(20, temp_ws.max_column + 1)): val = temp_ws.cell(row=row, column=col).value if val and "pvc" in str(val).lower(): print(f" GEFUNDEN in Sheet '{sheet_name}', Zeile {row}, Spalte {col}: {val}") print("\n5. SUCHE NACH SPARKASSE...") print("-" * 40) # Suche nach Sparkasse in Zeile 1 sparkasse_col = None for col in range(1, ws.max_column + 1): val = ws.cell(row=1, column=col).value if val and "sparkasse" in str(val).lower(): sparkasse_col = col print(f" GEFUNDEN in Spalte {col}: {val}") # Zeige die zugehörigen Labels label = ws.cell(row=2, column=col).value label2 = ws.cell(row=2, column=col+1).value print(f" Labels: {label}, {label2}") break # Jetzt die Restschuld und Rate holen if sparkasse_col: restschuld, last_row = get_last_value(ws, sparkasse_col) monatsrate = get_monthly_rate(ws, sparkasse_col + 1) zinssatz = get_zinssatz_from_berechnung(ws, sparkasse_col + 2, sparkasse_col) print(f" Restschuld: {restschuld:,.2f} EUR") print(f" Monatsrate: {monatsrate:,.2f} EUR") print(f" Zinssatz: {zinssatz}% (berechnet)") print("\n=== ZUSAMMENFASSUNG ===") print(""" Die 5 Kredite aus dem Task: 1. DSL Bank -> Spalte 9 in Sheet 'Tilgung bei Gleichbleibenden Be' 2. PSD Nord -> Spalte 13 in Sheet 'Tilgung bei Gleichbleibenden Be' 3. Zingelstr.14 DSL -> Teil von Zingelstr. 14 (Spalte 20) oder separat? 4. Zingelstr.14 Sparkasse -> Gefunden in Spalte 21! 5. PVCreditplus -> NICHT im Tilgung-Sheet gefunden! WICHTIG: Die Werte für Zingelstr. 14 scheinen KOMBINIERT zu sein (DSL + Sparkasse) Für separate Importe müssen wir die Einzelwerte finden! """)