---
name: "excel-generator"
description: "Professionelle Excel-Tabellen mit Ästhetik und Datenanalyse für strukturierte Daten."
---

# excel-generator

Professionelle Erstellung von Excel-Tabellen mit Fokus auf Ästhetik und Datenanalyse.

## Wann verwenden

- User fragt nach Excel, Tabellenkalkulation, Spreadsheet, XLSX
- Daten organisieren, analysieren, präsentieren
- Reports mit Pivot, Charts, Conditional Formatting
- Multi-Sheet-Workbooks

## Tools-Stack

```python
pip install openpyxl xlsxwriter pandas
```

| Lib | Stärken |
|---|---|
| **openpyxl** | Read+Write XLSX, Formatting, Charts |
| **xlsxwriter** | Write-only, beste Formatierung, Charts |
| **pandas** | DataFrame → Excel, schnell |

Empfehlung: **xlsxwriter** für Ästhetik, **pandas** wenn Daten bereits als DF vorliegen.

## Workflow

### 1. Datenstruktur klären
- Welche Sheets?
- Spalten + Typen?
- Header / Index?
- Formeln nötig?
- Charts/Pivot?

### 2. Design-Prinzipien

**Layout:**
- Header-Row mit Fettdruck + Background-Color
- Freeze-Panes für Scroll-Komfort
- Spaltenbreite an Inhalt anpassen
- Zahlen rechtsbündig, Text linksbündig

**Farbpalette (Corporate-Look):**
```
Primary:   #1F4E79 (Dark Blue)
Accent:    #2E75B6 (Mid Blue)
Light:     #D9E2F3
Text:      #333333
Success:   #70AD47
Warning:   #FFC000
Error:     #C00000
```

### 3. Code-Template (xlsxwriter)

```python
import xlsxwriter

wb = xlsxwriter.Workbook('report.xlsx')
ws = wb.add_worksheet('Übersicht')

# Formate
fmt_header = wb.add_format({
    'bold': True, 'bg_color': '#1F4E79',
    'font_color': 'white', 'align': 'center',
    'valign': 'vcenter', 'border': 1
})
fmt_money = wb.add_format({'num_format': '€#,##0.00', 'border': 1})
fmt_date  = wb.add_format({'num_format': 'dd.mm.yyyy', 'border': 1})
fmt_cell  = wb.add_format({'border': 1})

# Header
headers = ['Datum', 'Beschreibung', 'Betrag']
for col, h in enumerate(headers):
    ws.write(0, col, h, fmt_header)

# Daten
data = [...]
for row, item in enumerate(data, start=1):
    ws.write_datetime(row, 0, item['date'], fmt_date)
    ws.write(row, 1, item['desc'], fmt_cell)
    ws.write(row, 2, item['amount'], fmt_money)

# Spaltenbreiten
ws.set_column('A:A', 12)
ws.set_column('B:B', 40)
ws.set_column('C:C', 15)

# Freeze
ws.freeze_panes(1, 0)

# Sum-Formel
ws.write(len(data)+1, 1, 'Summe:', fmt_header)
ws.write_formula(len(data)+1, 2, f'=SUM(C2:C{len(data)+1})', fmt_money)

wb.close()
```

### 4. Charts

```python
chart = wb.add_chart({'type': 'column'})
chart.add_series({
    'name': 'Umsatz 2026',
    'categories': '=Übersicht!$A$2:$A$13',
    'values':     '=Übersicht!$B$2:$B$13',
    'fill':       {'color': '#2E75B6'},
})
chart.set_title({'name': 'Monatsumsatz'})
chart.set_x_axis({'name': 'Monat'})
chart.set_y_axis({'name': 'Euro'})
ws.insert_chart('E2', chart, {'x_scale': 1.5, 'y_scale': 1.5})
```

### 5. Conditional Formatting

```python
# Negative Werte rot
ws.conditional_format('C2:C13', {
    'type': 'cell', 'criteria': '<', 'value': 0,
    'format': wb.add_format({'font_color': '#C00000', 'bold': True})
})

# Top 3
ws.conditional_format('C2:C13', {
    'type': 'top', 'value': 3,
    'format': wb.add_format({'bg_color': '#FFEB9C'})
})

# Datenbalken
ws.conditional_format('C2:C13', {
    'type': 'data_bar', 'bar_color': '#2E75B6'
})
```

### 6. Pivot via pandas

```python
import pandas as pd
df = pd.read_csv('raw.csv')
pivot = df.pivot_table(
    index='Kategorie', columns='Monat',
    values='Betrag', aggfunc='sum', fill_value=0
)
pivot.to_excel(writer, sheet_name='Pivot', startrow=1)
```

## Patterns

| Use-Case | Pattern |
|---|---|
| Multi-Sheet Report | 1 Sheet pro Bereich, "Übersicht"-Sheet mit Links |
| Dashboard | Charts + KPI-Cards oben, Daten unten |
| Templating | Master-Sheet kopieren + Daten injizieren |
| Drop-Down | `ws.data_validation('A2:A100', {'validate': 'list', 'source': [...]})` |

## Fallstricke

- ⚠️ Datumsformat: `write_datetime` mit `datetime`-Objekt nutzen, nicht String
- ⚠️ Spaltenbreite manuell setzen (Auto-Fit gibt's in xlsxwriter nicht)
- ⚠️ Formeln: nur Excel-Syntax (`=SUM`), nicht Python
- ⚠️ Bei großen Files (>100k Zeilen): `constant_memory=True` in Workbook
- ⚠️ Bilder einbetten: `insert_image()` mit absolutem Pfad
- ⚠️ macOS-Versionen: ältere Excel rendert manche Formate anders

## Lieferung

- `MEDIA:<pfad>.xlsx` auf eigener Zeile
- Kurz beschreiben was im File ist (Sheets, Charts, Formeln)
