python
import csv
from openpyxl import Workbook
from openpyxl.styles import Font
# 1: einlesen
with open('verkaeufe.csv', newline='', encoding='utf-8-sig') as f:
zeilen = list(csv.DictReader(f, delimiter=';'))
for z in zeilen:
z['menge'] = int(z['menge'])
z['preis'] = float(z['preis'])
z['umsatz'] = z['menge'] * z['preis']
# 2: pro Kunde summieren
pro_kunde = {}
for z in zeilen:
pro_kunde[z['kunde']] = pro_kunde.get(z['kunde'], 0) + z['umsatz']
# 3: Excel schreiben
wb = Workbook()
ws1 = wb.active
ws1.title = 'Details'
ws1.append(['Kunde', 'Artikel', 'Menge', 'Preis', 'Umsatz'])
for z in zeilen:
ws1.append([z['kunde'], z['artikel'], z['menge'], z['preis'], z['umsatz']])
letzte = ws1.max_row
ws1.append(['', '', '', 'Summe', f'=SUM(E2:E{letzte})'])
ws2 = wb.create_sheet('Pro Kunde')
ws2.append(['Kunde', 'Umsatz'])
for kunde, summe in sorted(pro_kunde.items(), key=lambda p: p[1], reverse=True):
ws2.append([kunde, summe])
# 4: formatieren
for ws in (ws1, ws2):
for zelle in ws[1]:
zelle.font = Font(bold=True)
ws.column_dimensions['A'].width = 16
for zeile in ws1.iter_rows(min_row=2, min_col=4, max_col=5):
for zelle in zeile:
zelle.number_format = '0.00'
for zeile in ws2.iter_rows(min_row=2, min_col=2, max_col=2):
zeile[0].number_format = '0.00'
wb.save('auswertung.xlsx')
Was passiert:
- Alle CSV-Werte sind zuerst Strings. Die erste Schleife wandelt sie in Zahlen um und ergänzt eine neue Spalte
umsatzdirekt im Dictionary. - Die Gruppierung pro Kunde folgt dem Zählermuster aus Kapitel 4:
get(schluessel, 0) + wert. Workbook()legt eine Datei mit einem leeren Blatt an, dasactiveheißt und hier inDetailsumbenannt wird.create_sheet('Pro Kunde')fügt ein weiteres hinzu.ws1.max_rowwird gelesen, bevor die Summenzeile angehängt wird, damit die Formel genau über die Datenzeilen läuft (E2:E5).- Die Schleife
for ws in (ws1, ws2)wendet dieselbe Formatierung auf beide Blätter an, statt sie zu kopieren.
Warum so: Daten zuerst sauber in Python-Strukturen bringen, dann in ein Ausgabeformat schreiben. So kannst du dieselben Daten später auch in eine Datenbank oder Webseite geben, ohne die Berechnung zu ändern.