Help me met het genereren van aangepaste Pandas DataFrame-rapporten in Excel
description
Met deze prompt kun je professionele, op maat gemaakte Excel-rapporten genereren vanuit je Pandas DataFrame, inclusief geavanceerde opmaak en meerdere werkbladen. Dit bespaart tijd bij het maken van terugkerende rapporten en verbetert de presentatie van je data, wat beter is dan alleen ruwe data-export.
prompt
Ik heb een Pandas DataFrame met de volgende gegevens: <voer een beschrijving of voorbeeld van je DataFrame in>. Help me een Python-script te schrijven dat dit DataFrame exporteert naar een ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van een Python-script dat je DataFrame exporteert naar een Excel-bestand met meerdere werkbladen, aangepaste opmaak, samenvattingen en grafieken. Het gebruikt de `pandas` en `openpyxl` bibliotheken, en voor geavanceerdere opmaak en grafieken kun je ook `xlsxwriter` gebruiken.
```python
import pandas as pd
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
from openpyxl.styles import Font, Fill, PatternFill, Alignment
from openpyxl.chart import BarChart, Reference
# Stel je DataFrame voor
# df = jouw DataFrame met de kolommen: Datum, Product, Aantal, Prijs, Regio
# Voorbeeld: Laad je DataFrame
# df = pd.read_csv('verkoopgegevens.csv') # of andere manier van inladen
# Maak een ExcelWriter met xlsxwriter engine voor meer opmaakmogelijkheden
with pd.ExcelWriter('Verkooprapport.xlsx', engine='xlsxwriter') as writer:
workbook = writer.book
# 1. Voeg een overzichtssheet toe met samenvatting
# Bijvoorbeeld totaal aantal, omzet per regio
overzicht = df.groupby('Regio').agg(
Totaal_Aantal=('Aantal', 'sum'),
Omzet=('Prijs', lambda x: (x * df.loc[x.index, 'Aantal']).sum())
).reset_index()
overzicht.to_excel(writer, sheet_name='Samenvatting', index=False)
# Opmaak voor de samenvatting
sheet_overzicht = writer.sheets['Samenvatting']
# Maak kopteksten vet
for col_num, value in enumerate(overzicht.columns):
cell = sheet_overzicht.cell(row=1, column=col_num+1)
cell.font = cell.font.copy(bold=True)
# 2. Voeg een detailwerkblad toe met alle transacties
df.to_excel(writer, sheet_name='Transacties', index=False)
sheet_transacties = writer.sheets['Transacties']
# Opmaak: kopteksten vet en achtergrondkleur
header = sheet_transacties[1]
for cell in header:
cell.font = cell.font.copy(bold=True)
cell.fill = PatternFill(start_color="FFCCFFCC", end_color="FFCCFFCC", fill_type="solid")
cell.alignment = Alignment(horizontal='center')
# 3. Voeg een grafiek toe (bijvoorbeeld omzet per regio)
# Eerst maken we een draaitabel of samenvatting
omzet_per_regio = df.groupby('Regio').apply(
lambda x: (x['Prijs'] * x['Aantal']).sum()
).reset_index(name='Omzet')
# Voeg deze data toe aan het werkblad
sheet_overzicht.append([''])
sheet_overzicht.append(['Omzet per Regio'])
for r in dataframe_to_rows(omzet_per_regio, index=False, header=True):
sheet_overzicht.append(r)
# Maak een grafiek voor omzet per regio
chart = BarChart()
data = Reference(sheet_overzicht, min_col=2, min_row=2, max_row=1+len(omzet_per_regio), max_col=2)
categories = Reference(sheet_overzicht, min_col=1, min_row=2, max_row=1+len(omzet_per_regio))
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
chart.title = "Omzet per Regio"
chart.x_axis.title = "Regio"
chart.y_axis.title = "Omzet"
# Plaats de grafiek op een nieuw werkblad
wb = writer.book
ws_chart = wb.create_sheet(title='Grafieken')
ws_chart.add_chart(chart, "A1")
# 4. Automatisering voor regelmatige rapportages
# - Plaats je script in een Python-bestand
# - Plan het automatisch uit te voeren via een scheduler zoals cron (Linux) of Taakplanner (Windows)
# - Laad de DataFrame automatisch uit je gegevensbron
# - Pas het script aan om dynamisch datums of parameters te verwerken
# - Sla de rapporten op met datumstempels voor versiebeheer
# Het script sluit automatisch af en slaat het Excel-bestand op.
```
**Hoe je dit efficiënt kunt automatiseren:**
- Plaats je script in een Python-bestand (.py).
- Gebruik een scheduler zoals cron (Linux) of Windows Taakplanner om het script op regelmatige tijdstippen uit te voeren.
- Zorg dat je script automatisch je gegevensbron laadt (bijvoorbeeld een database, CSV-bestand, API).
- Voeg dynamische namen toe voor de rapporten (bijvoorbeeld met datums in de bestandsnaam).
- Overweeg het gebruik van functies en parameters om rapporten aan te passen zonder veel code te dupliceren.
- Bewaar templates en scripts op een centrale locatie zodat ze gemakkelijk te onderhouden zijn.
Door dit proces te automatiseren, wordt het genereren van rapporten snel, consistent en foutvrij.
provider: deepseek
model: deepseek-chat
Ik help je graag een Python-script te schrijven voor het exporteren van je DataFrame naar Excel met meerdere werkbladen en opmaak. Hier is een complete oplossing:
```python
import pandas as pd
import numpy as np
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.chart import BarChart, Reference
from openpyxl.utils.dataframe import dataframe_to_rows
from datetime import datetime
import os
def export_naar_excel_met_opmaak(df, bestandsnaam):
"""
Exporteert DataFrame naar Excel met meerdere werkbladen en opmaak
"""
# Maak een nieuwe Excel workbook aan
wb = Workbook()
# Verwijder standaard sheet
if 'Sheet' in wb.sheetnames:
std_sheet = wb['Sheet']
wb.remove(std_sheet)
# 1. HOOFDSHEET - Gedetailleerde gegevens
ws_detailed = wb.create_sheet("Gedetailleerde Verkoop")
# Voeg data toe aan sheet
for r in dataframe_to_rows(df, index=False, header=True):
ws_detailed.append(r)
# Pas opmaak toe op hoofdsheet
pas_detailed_opmaak_toe(ws_detailed, df)
# 2. SAMENVATTINGSHEET - Totaaloverzicht
ws_summary = wb.create_sheet("Samenvatting")
# Maak samenvattingen
maak_samenvattingen(df, ws_summary)
# 3. REGIO-ANALYSE SHEET
ws_regio = wb.create_sheet("Regio-Analyse")
maak_regio_analyse(df, ws_regio, wb)
# 4. PRODUCT-ANALYSE SHEET
ws_product = wb.create_sheet("Product-Analyse")
maak_product_analyse(df, ws_product, wb)
# 5. MAANDELIJKSE TREND SHEET
ws_trend = wb.create_sheet("Maandelijkse Trend")
maak_maandelijkse_trend(df, ws_trend, wb)
# Sla bestand op
wb.save(bestandsnaam)
print(f"Bestand opgeslagen als: {bestandsnaam}")
def pas_detailed_opmaak_toe(ws, df):
"""Past opmaak toe op gedetailleerde sheet"""
# Stel kolombreedtes in
kolom_breedtes = {'A': 15, 'B': 20, 'C': 12, 'D': 12, 'E': 15}
for kolom, breedte in kolom_breedtes.items():
ws.column_dimensions[kolom].width = breedte
# Header opmaak
header_fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid")
header_font = Font(color="FFFFFF", bold=True)
header_border = Border(bottom=Side(style="medium"))
for cell in ws[1]:
cell.fill = header_fill
cell.font = header_font
cell.border = header_border
# Getalopmaak voor bedragen
for row in range(2, ws.max_row + 1):
ws[f'D{row}'].number_format = '#,##0.00'
ws[f'C{row}'].number_format = '#,##0'
def maak_samenvattingen(df, ws):
"""Maakt samenvattingsoverzichten"""
# Bereken totalen
totaal_omzet = (df['Aantal'] * df['Prijs']).sum()
totaal_transacties = len(df)
gem_waarde = totaal_omzet / totaal_transacties
# Schrijf samenvatting
ws['A1'] = "Verkoopsamenvatting"
ws['A1'].font = Font(size=16, bold=True)
samenvatting_data = [
["Totaal Omzet", f"€ {totaal_omzet:,.2f}"],
["Totaal Transacties", f"{totaal_transacties:,}"],
["Gemiddelde Transactiewaarde", f"€ {gem_waarde:,.2f}"],
["Aantal Producten", f"{df['Product'].nunique()}"],
["Aantal Regio's", f"{df['Regio'].nunique()}"],
["Rapportdatum", datetime.now().strftime("%d-%m-%Y %H:%M")]
]
for i, (label, waarde) in enumerate(samenvatting_data, start=3):
ws[f'A{i}'] = label
ws[f'B{i}'] = waarde
ws[f'A{i}'].font = Font(bold=True)
def maak_regio_analyse(df, ws, wb):
"""Analyse per regio"""
regio_omzet = df.groupby('Regio').apply(
lambda x: (x['Aantal'] * x['Prijs']).sum()
).reset_index(name='Omzet')
for r in dataframe_to_rows(regio_omzet, index=False, header=True):
ws.append(r)
# Maak staafdiagram
chart = BarChart()
chart.type = "col"
chart.title = "Omzet per Regio"
chart.style = 10
data = Reference(ws, min_col=2, min_row=2, max_row=len(regio_omzet)+1, max_col=2)
categories = Reference(ws, min_col=1, min_row=2, max_row=len(regio_omzet)+1)
chart.add_data(data, titles_from_data=True)
chart.set_categories(categories)
ws.add_chart(chart, "D2")
def maak_product_analyse(df, ws, wb):
"""Analyse per product"""
product_omzet = df.groupby('Product').apply(
lambda x: (x['Aantal'] * x['Prijs']).sum()
).reset_index(name='Omzet').sort_values('Omzet', ascending=False)
for r in dataframe_to_rows(product_omzet, index=False, header=True):
ws.append(r)
def maak_maandelijkse_trend(df, ws, wb):
"""Maandelijkse trendanalyse"""
df['Datum'] = pd.to_datetime(df['Datum'])
df['Maand'] = df['Datum'].dt.to_period('M')
maand_omzet = df.groupby('Maand').apply(
lambda x: (x['Aantal'] * x['Prijs']).sum()
).reset_index(name='Omzet')
maand_omzet['Maand'] = maand_omzet['Maand'].astype(str)
for r in dataframe_to_rows(maand_omzet, index=False, header=True):
ws.append(r)
# AUTOMATISERING VOOR REGELMATIGE RAPPORTAGES
def automatiseer_rapportages(df, output_map="rapporten/", planning="dagelijks"):
"""
Automatiseer regelmatige rapportages
"""
# Maak output map aan als deze niet bestaat
os.makedirs(output_map, exist_ok=True)
# Genereer bestandsnaam op basis van planning
datum = datetime.now().strftime("%Y%m%d")
if planning == "dagelijks":
bestandsnaam = f"{output_map}verkoop_rapport_{datum}.xlsx"
elif planning == "wekelijks":
week_nummer = datetime.now().strftime("%V")
bestandsnaam = f"{output_map}verkoop_rapport_week_{week_nummer}_{datetime.now().year}.xlsx"
elif planning == "maandelijks":
maand = datetime.now().strftime("%Y%m")
bestandsnaam = f"{output_map}verkoop_rapport_{maand}.xlsx"
else:
bestandsnaam = f"{output_map}verkoop_rapport_{datum}.xlsx"
# Exporteer naar Excel
export_naar_excel_met_opmaak(df, bestandsnaam)
return bestandsnaam
# GEBRUIK VAN HET SCRIPT
if __name__ == "__main__":
# Voorbeeld: Laad je DataFrame (vervang dit met je eigen data)
# df = pd.read_csv('jouw_bestand.csv')
# Of gebruik bestaand DataFrame
# export_naar_excel_met_opmaak(your_dataframe, "verkoop_rapport.xlsx")
# Voor automatische planning:
# automatiseer_rapportages(your_dataframe, planning="wekelijks")
print("Script gereed voor gebruik. Pas de dataframe loading aan naar jouw data.")
```
## 📋 Installatievereisten:
```bash
pip install pandas openpyxl numpy
```
## 🚀 Automatiseringstips:
### 1. **Windows Taakplanner** (voor dagelijkse/weekelijkse rapportages):
- Maak een batch-bestand (.bat) dat je Python-script uitvoert
- Plan deze in via Taakplanner
### 2. **Linux Cron Job**:
```bash
# Voeg toe aan crontab (crontab -e)
0 8 * * 1 /usr/bin/python3 /pad/naar/script.py >> /var/log/verkoop_rapport.log
```
### 3. **Python Scheduler** (voor real-time automatisering):
```python
from apscheduler.schedulers.background import BackgroundScheduler
def geplande_export():
df = laad_verkoop_data() # Je data laadfunctie
automatiseer_rapportages(df, planning="dagelijks")
scheduler = BackgroundScheduler()
scheduler.add_job(geplande_export, 'cron', hour=8, minute=0) # Dagelijks om 8:00
scheduler.start()
```
## 💡 Optimalisatietips voor grote datasets:
1. **Chunk processing** voor zeer grote bestanden
2. **Memory management** met `df = df.astype({'kolom': 'categorie'})`
3. **Multiprocessing** voor complexe berekeningen
4. **Incrementele updates** i.p.v. volledige herberekening
Wil je dat ik specifieke onderdelen aanpas of uitbreid voor jouw use case?
error: Generation failed [deepseek] prompt_id=3422 locale=fr err=DeepSeek connection/timeout