devbatu
Proje başlat

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.

Kısa cevaplar

Python ile Excel otomasyonu için hangi kütüphaneler gerekir?

Veri işleme için pandas, biçimlendirme ve hücre düzeyinde işlemler için openpyxl yeterlidir. Grafik için matplotlib ya da openpyxl'in grafik modülü kullanılabilir.

Python bilmeyen ekip bunu kullanabilir mi?

Evet. Betik bir kez yazılır; ekip ya çift tıklayarak çalıştırır ya da hiç dokunmaz ve rapor zamanlayıcıyla kendiliğinden gelir.

Google Sheets ile de çalışır mı?

Evet. Google Sheets API ile aynı işlemler çevrim içi tablolar üzerinde de yapılabilir.

Bu yazıdakini işletmenize kurdurmak ister misiniz?

Yazıda anlatılanların hepsini uçtan uca kuruyorum. Kısaca ihtiyacınızı yazın, net bir yol haritasıyla döneyim.