Python ile Excel otomasyonu
Birçok ofiste haftanın bir yarım günü aynı işe gidiyor: şubelerden gelen Excel dosyalarını birleştirmek, toplamları almak, pivot tablo yapmak ve raporu herkese göndermek. Bu yazıda aynı işi Python ile nasıl tek komuta indirebileceğinizi gerçek kodla gösteriyorum.
Neden makro değil de Python?
Tek dosyanın içindeki küçük işler için VBA makrosu hızlı bir çözüm. Ama iş çok dosyalı, zamanlanmış ya da başka bir sisteme (veritabanı, e-posta, Google Sheets) bağlı olduğunda Python çok daha güçlü: pandas ile veriyi işlemek, openpyxl ile biçimlendirmek ve zamanlayıcıyla her pazartesi sabahı otomatik çalıştırmak mümkün.
1. Klasördeki bütün dosyaları birleştirmek
import pandas as pd
from pathlib import Path
dosyalar = sorted(Path("gelen").glob("*.xlsx"))
parcalar = []
for f in dosyalar:
df = pd.read_excel(f)
df["sube"] = f.stem # dosya adını şube adı olarak ekle
parcalar.append(df)
veri = pd.concat(parcalar, ignore_index=True)
Yüz dosya da olsa bin dosya da olsa kod aynı. Dosya adlarından şube bilgisini almak, sonradan "hangi satır nereden geldi" sorusunu çözer.
2. Temizlemek: en çok atlanan adım
veri.columns = veri.columns.str.strip().str.lower()
veri = veri.dropna(subset=["urun"])
veri["tutar"] = pd.to_numeric(veri["tutar"], errors="coerce").fillna(0)
veri["tarih"] = pd.to_datetime(veri["tarih"], dayfirst=True, errors="coerce")
Elle doldurulan Excel'lerde başlıkta fazladan boşluk, sayı yerine metin, farklı tarih biçimleri çok yaygın. Otomasyonun güvenilirliği bu adımdan geçiyor; hatalı satırları sessizce atmak yerine ayrı bir "kontrol edilecekler" sayfasına yazmak iyi bir alışkanlık.
3. Raporu üretmek
ozet = (veri.groupby(["sube", "urun"], as_index=False)["tutar"].sum()
.sort_values("tutar", ascending=False))
pivot = veri.pivot_table(index="sube", columns=veri["tarih"].dt.month,
values="tutar", aggfunc="sum", fill_value=0)
with pd.ExcelWriter("haftalik_rapor.xlsx", engine="openpyxl") as w:
ozet.to_excel(w, sheet_name="Özet", index=False)
pivot.to_excel(w, sheet_name="Aylık")
4. Biçimlendirmek
from openpyxl import load_workbook
from openpyxl.styles import Font
wb = load_workbook("haftalik_rapor.xlsx")
ws = wb["Özet"]
for hucre in ws[1]:
hucre.font = Font(bold=True)
for satir in ws.iter_rows(min_row=2, min_col=3, max_col=3):
for hucre in satir:
hucre.number_format = '#,##0.00 "₺"'
ws.column_dimensions["B"].width = 32
wb.save("haftalik_rapor.xlsx")
5. Zamanlamak ve göndermek
Windows'ta Görev Zamanlayıcı, Linux sunucuda cron ile betik her pazartesi 08:00'de çalışabilir. Sonuna eklenen birkaç satırla rapor e-postayla ya da WhatsApp/Telegram bildirimiyle ekibe gider. Ekip Excel'de çalışmaya devam eder; değişen tek şey raporun artık kendiliğinden hazır olması.
Nerede dikkat etmeli?
- Kaynak dosyaların şablonu değişirse betik bozulabilir. Başta sütun adlarını kontrol eden bir doğrulama adımı koyun.
- Büyük dosyalarda (yüz binlerce satır) CSV ve doğru veri tipleri hız kazandırır.
- Hassas veri varsa betik kendi bilgisayarınızda ya da sunucunuzda çalışmalı; hiçbir şey dışarı gitmemeli.
Kendi raporunuzu otomatikleştirmek ama bununla uğraşmak istemiyorsanız Excel ve ofis otomasyonu hizmetime bakabilirsiniz; örnek bir dosyanızı gönderin, nasıl otomatikleşeceğini somut olarak göstereyim.