itsrda

Excel Raporlarını Profesyonel Göstermek: Python ile Logolu Şablon (openpyxl)

Bir personel panelinin Excel dışa aktarımlarının neden "boş ve sade" göründüğünü, ortak bir şablonla (logo, başlık bloğu, tablo stili, yazdırma ayarı) nasıl düzeldiğini ve openpyxl ile uygulama adımlarını anlatan proje notu.

Personel takip panelinin ilk sürümünde indirilen Excel dosyaları işlevseldi ama çıplaktı: ilk satırda başlıklar, altında düz veri, kalın bir çizgi bile yok. Yöneticiler bu dosyaları genel müdüre, muhasebeye ya da denetime gönderiyordu ve ilk tepki hep aynıydı: "Bu çok sade, çok boş." Doğru bir tepkiydi; çünkü bir rapor sadece veri değil, aynı zamanda bir belgedir. Bu not, tüm indirmeler için ortak bir Excel şablonunu nasıl kurduğumuzu anlatıyor.

Sorun: her rapor ayrı ayrı yazılmıştı

Panelde aylık özet, resmi tatil, personel kartı, devamsızlık gibi birçok Excel çıktısı vardı ve her biri kendi kodunda sıfırdan başlıyordu. Biri başlığı kalın yapmış, biri yapmamış; sütun genişlikleri tutarsız; yazdırınca sayfa yarıda kesiliyor. Düzeltmek için her rapora ayrı dokunmak gerekecekti ve bir sonraki rapor yine tutarsız olacaktı.

Çözüm, tek bir şablon modülü yazmak ve tüm raporların onu çağırmasını sağlamaktı; bu, gece vardiyası kuralında kullandığımız "tek doğruluk kaynağı" ilkesinin bir başka örneği.

Şablonun bileşenleri

  1. Üst alan: Solda logo, yanında rapor adı, altında dönem ve oluşturulma zamanı. Logo, belgeyi kuruma ait kılan en güçlü görsel işarettir.
  2. Bölüm başlıkları: Koyu zeminli, beyaz yazılı bir şerit; raporun mantıksal bölümlerini ayırır.
  3. Tablo stili: Koyu başlık satırı, dönüşümlü hafif zebra çizgileri, ince kenarlıklar, sayılar sağa, metinler sola hizalı.
  4. Sayı ve tarih biçimleri: Süreler ss:dd, tarihler GG.AA.YYYY; ham sayı yerine okunur biçim.
  5. Alt bilgi: "Bu rapor ... tarihinde otomatik oluşturulmuştur" ve sayfa numarası.
  6. Sayfa ayarı: Yatay yönlendirme, sayfaya sığdırma, başlık satırının her sayfada tekrarı, uygun kenar boşlukları.
  7. Dondurma ve filtre: Başlık satırı dondurulur, sütunlara filtre eklenir; uzun listelerde gezinmek kolaylaşır.

openpyxl ile örnek

Aşağıdaki sadeleştirilmiş kod, bir başlık bloğu ve stilli bir tablo oluşturur:

from openpyxl import Workbook
from openpyxl.drawing.image import Image
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side

KOYU = "1F3A5F"; ACIK = "EEF2F7"
ince = Side(style="thin", color="C9D3E0")

def ust_alan(ws, baslik, alt, logo=None, genislik=8):
    ws.merge_cells(start_row=1, start_column=3, end_row=1, end_column=genislik)
    ws["C1"] = baslik
    ws["C1"].font = Font(size=18, bold=True, color=KOYU)
    ws.merge_cells(start_row=2, start_column=3, end_row=2, end_column=genislik)
    ws["C2"] = alt
    ws["C2"].font = Font(size=10, color="64748B")
    ws.row_dimensions[1].height = 34
    if logo:
        img = Image(logo); img.width, img.height = 64, 60
        ws.add_image(img, "A1")

def tablo(ws, baslangic_satir, basliklar, satirlar):
    for j, b in enumerate(basliklar, 1):
        h = ws.cell(row=baslangic_satir, column=j, value=b)
        h.font = Font(bold=True, color="FFFFFF")
        h.fill = PatternFill("solid", fgColor=KOYU)
        h.alignment = Alignment(horizontal="center", vertical="center")
    for i, satir in enumerate(satirlar, baslangic_satir + 1):
        for j, v in enumerate(satir, 1):
            c = ws.cell(row=i, column=j, value=v)
            c.border = Border(bottom=ince)
            if (i - baslangic_satir) % 2 == 0:
                c.fill = PatternFill("solid", fgColor=ACIK)
    ws.freeze_panes = ws.cell(row=baslangic_satir + 1, column=1)
    ws.auto_filter.ref = ws.dimensions

Sayfa yazdırma ayarı için ws.page_setup.orientation = "landscape", ws.page_setup.fitToWidth = 1 ve ws.print_title_rows = "4:4" gibi satırlar eklenir. Sütun genişliklerini veri uzunluğuna göre hesaplayıp en geniş değere küçük bir pay eklemek, "###" görünümünü ve kırpılmış başlıkları önler.

Dikkat edilen ayrıntılar

  • Logo boyutu: Büyük bir logo satır yüksekliğini bozar; küçük bir PNG ve sabit boyut kullanın. Logo yoksa şablon hata vermeden metinle devam eder.
  • Formüller yerine değerler: Rapor denetime gidiyorsa sayılar sabit değer olarak yazılır; ancak toplam satırlarında Excel formülü kullanmak okuyana hesabı doğrulama imkânı verir.
  • Kişisel veri: Rapor kimlere gidiyorsa yalnızca onların görmesi gereken sütunlar yer almalı; bölüm müdürü kendi bölümünün raporunu alır (güvenlik katmanları, KVKK notları).
  • Her indirme kayda alınır: Kim hangi raporu ne zaman indirdi, denetim kaydında tutulur.
  • Test: Şablonu görsel olarak denemek için dosyayı bir ofis programıyla PDF'e çevirip bakmak, kod okumaktan çok daha hızlı hata yakalar.

Sonuç

Ortak şablondan sonra yeni bir rapor yazmak, yalnızca veriyi vermek demek oldu: birkaç satırda başlık, tablo ve yazdırma ayarı hazır geliyor. En büyük kazanç estetik değil, güvendi: yöneticiler dosyayı kimseye açıklama yapmadan gönderebiliyor ve her rapor aynı kurumsal görünümü taşıyor. Küçük bir ayrıntı gibi görünse de, bir sistemin "iş gören" ile "ciddiye alınan" arasındaki farkı çoğu zaman bu tür ayrıntılar kapatıyor.

Fazla mesai ve vardiya hesaplarını raporlamadan önce doğrulamak isterseniz vardiya hesaplayıcıyı kullanabilirsiniz.

Not: Komutları üretim ortamında çalıştırmadan önce yedek alın ve önce test ortamında deneyin. Bir adım sizde farklı davranıyorsa bize yazın, rehberi güncelleyelim.