Eksport do CSV
Podstawowy eksport do CSV:
Python1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16import pandas as pd df = pd.DataFrame({ "Nazwa": ["Jan", "Anna", "Piotr"], "Wartość": [100, 200, 150], "Data": pd.date_range("2024-01-01", periods=3) }) # Podstawowy eksport do CSV df.to_csv("raport.csv", index=False) # Z kodowaniem UTF-8 i separatorami df.to_csv("raport.csv", index=False, encoding="utf-8-sig", sep=";") # Z kompresją df.to_csv("raport.csv.gz", index=False, compression="gzip")
Eksport do Excel z formatowaniem
Zaawansowane formatowanie w Excel:
Python1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28import pandas as pd from openpyxl import load_workbook from openpyxl.styles import Font, PatternFill, Alignment # Podstawowy eksport do Excel df.to_excel("raport.xlsx", index=False) # Z wieloma arkuszami with pd.ExcelWriter("raporty.xlsx", engine='openpyxl') as writer: df.to_excel(writer, sheet_name="Arkusz 1", index=False) df2.to_excel(writer, sheet_name="Arkusz 2", index=False) # Z formatowaniem with pd.ExcelWriter("raport_sformatowany.xlsx", engine='openpyxl') as writer: df.to_excel(writer, sheet_name="Dane", index=False) # Formatowanie po zapisaniu workbook = writer.book worksheet = writer.sheets["Dane"] # Formatowanie nagłówków header_fill = PatternFill(start_color="4472C4", end_color="4472C4", fill_type="solid") header_font = Font(bold=True, color="FFFFFF") for cell in worksheet[1]: cell.fill = header_fill cell.font = header_font cell.alignment = Alignment(horizontal="center")
Generowanie PDF z raportu
Tworzenie PDF z DataFrame:
Python1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45from reportlab.lib.pagesizes import letter from reportlab.platypus import SimpleDocTemplate, Table, TableStyle, Paragraph, Spacer from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet import pandas as pd def dataframe_to_pdf(df: pd.DataFrame, output_file: str, title: str = "Raport"): """Konwertuje DataFrame do PDF.""" doc = SimpleDocTemplate(output_file, pagesize=letter) elements = [] styles = getSampleStyleSheet() title_style = styles['Title'] # Tytuł elements.append(Paragraph(title, title_style)) elements.append(Spacer(1, 12)) # Konwersja DataFrame do tabeli data = [df.columns.tolist()] + df.values.tolist() table = Table(data) # Stylowanie tabeli table.setStyle(TableStyle([ ('BACKGROUND', (0, 0), (-1, 0), colors.grey), ('TEXTCOLOR', (0, 0), (-1, 0), colors.whitesmoke), ('ALIGN', (0, 0), (-1, -1), 'CENTER'), ('FONTNAME', (0, 0), (-1, 0), 'Helvetica-Bold'), ('FONTSIZE', (0, 0), (-1, 0), 12), ('BOTTOMPADDING', (0, 0), (-1, 0), 12), ('BACKGROUND', (0, 1), (-1, -1), colors.beige), ('GRID', (0, 0), (-1, -1), 1, colors.black) ])) elements.append(table) doc.build(elements) print(f"Raport PDF utworzony: {output_file}") # Przykład: generowanie raportu PDF z DataFrame df = pd.DataFrame({ "Nazwa": ["Jan", "Anna", "Piotr"], "Wartość": [100, 200, 150] }) dataframe_to_pdf(df, "raport.pdf", "Miesięczny raport sprzedaży")
Kompresja raportów
Automatyczna kompresja dużych raportów:
Python1 2 3 4 5 6 7 8 9 10 11 12import gzip import json def compress_report(data: dict, output_file: str): """Kompresuje raport do pliku gzip.""" with gzip.open(output_file, 'wt', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, indent=2) print(f"Raport skompresowany: {output_file}") # Przykład: kompresja DataFrame do JSON df_dict = df.to_dict(orient='records') compress_report(df_dict, "raport.json.gz")
Wysyłka raportów
Automatyczna wysyłka raportów e-mailem:
Python1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42import smtplib from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email.mime.text import MIMEText from email import encoders from pathlib import Path def send_report_email( report_path: str, recipient: str, subject: str = "Automatyczny raport" ): """Wysyła raport e-mailem.""" msg = MIMEMultipart() msg["From"] = "raporty@firma.pl" msg["To"] = recipient msg["Subject"] = subject body = "W załączniku znajduje się aktualny raport." msg.attach(MIMEText(body, "plain")) # Załączanie raportu with open(report_path, "rb") as f: part = MIMEBase("application", "octet-stream") part.set_payload(f.read()) encoders.encode_base64(part) part.add_header( "Content-Disposition", f"attachment; filename= {Path(report_path).name}" ) msg.attach(part) # Wysyłka (wymaga konfiguracji SMTP) # server = smtplib.SMTP("smtp.gmail.com", 587) # server.starttls() # server.login("user", "password") # server.send_message(msg) # server.quit() print(f"Raport wysłany do: {recipient}") send_report_email("raport.xlsx", "uzytkownik@firma.pl")
Podsumowanie
Generowanie raportów z Pandas obejmuje:
- Eksport do CSV z kodowaniem i kompresją
- Eksport do Excel z formatowaniem i stylami
- Generowanie PDF z tabelami i nagłówkami
- Kompresję dużych raportów
- Automatyczną wysyłkę raportów e-mailem
Te techniki pozwalają na kompletne automatyzowanie procesu raportowania.
➡️ Następny artykuł
Po opanowaniu generowania raportów, naucz się automatyzować harmonogramy zadań:
Harmonogramy zadań w Pythonie: cron, APScheduler, asyncio — automatyczne uruchamianie skryptów o określonych porach, wykorzystanie równoległości i asynchroniczności w automatyzacji.



