إنشاء تقارير Excel احترافية باستخدام بايثون: صيغ، تنسيقات، وجداول Pivot

إنشاء تقارير Excel احترافية باستخدام بايثون: صيغ، تنسيقات، وجداول Pivot

ملفات Excel ما زالت واحدة من أهم الأدوات في تحليل البيانات وإعداد التقارير في الشركات الصغيرة والكبيرة. لكن إعداد التقارير يدويًا يتطلب وقتًا كبيرًا، ويكون معرضًا للأخطاء، خصوصًا عندما تتكرر نفس التقارير بشكل يومي أو أسبوعي.

بايثون مع مكتبات مثل Pandas وOpenPyXL توفر لك طريقة قوية ومرنة لإنشاء تقارير Excel احترافية، ديناميكية، قابلة للتحديث تلقائيًا، مع صيغ وتنسيقات وجداول Pivot (Pivot Tables) جاهزة بضغطة زر.

في هذا المقال سنشرح خطوة بخطوة كيفية استخدام Python Excel OpenPyXL Pandas لإنشاء ملفات Excel متقدمة، بدءًا من التعامل مع البيانات في Pandas، مرورًا بتصديرها إلى Excel، ثم إضافة الصيغ والتنسيقات وجداول Pivot بشكل برمجي.

لماذا استخدام بايثون لإنشاء تقارير Excel؟

  • التكرار التلقائي: يمكنك تشغيل سكربت يولّد نفس التقرير يوميًا/أسبوعيًا بدون تدخل يدوي.
  • تقليل الأخطاء: بدلاً من النسخ واللصق في Excel، تكون كل الخطوات محددة برمجيًا.
  • الربط مع مصادر بيانات متعددة: قواعد بيانات، ملفات CSV، واجهات API ثم تجميعها في تقرير Excel واحد.
  • إضافة منطق تحليلي متقدم: باستخدام Pandas في Python للتحليل ثم تصدير النتائج إلى Excel.
  • إمكانية الدمج مع أدوات أخرى: مثل الرسم البياني باستخدام Matplotlib كما في مقالنا شرح Matplotlib: كيفية إنشاء رسوم بيانية احترافية باستخدام بايثون.

أهم المكتبات: Pandas و OpenPyXL

1. مكتبة Pandas

Pandas هي الأداة الأساسية للتعامل مع البيانات في بايثون. تسمح لك بقراءة بيانات من ملفات Excel وCSV وقواعد البيانات، وتنظيفها وتحليلها بسهولة.

  • الهيكل الرئيسي: DataFrame (جدول يشبه جدول Excel).
  • عمليات مثل: التجميع، التصفية، الفرز، الحسابات الإحصائية.

2. مكتبة OpenPyXL

OpenPyXL مسؤولة عن التعامل المباشر مع ملفات Excel (بصيغة .xlsx). تمنحك تحكمًا في:

  • إنشاء ملفات Excel جديدة أو تعديل ملفات موجودة.
  • تغيير التنسيقات: ألوان، خطوط، حدود، دمج خلايا، عرض الأعمدة، إلخ.
  • إضافة الصيغ (Formulas)، المخططات، وكذلك Pivot Tables في الإصدارات الحديثة.

التكامل بين Pandas وOpenPyXL هو ما يجعل إنشاء تقارير Excel الاحترافية أمرًا قويًا ومرنًا في نفس الوقت.

تثبيت المكتبات المطلوبة

أول خطوة هي تثبيت المكتبات اللازمة:

pip install pandas openpyxl

في حال كنت تستخدم بيئة عمل علميّة مثل Anaconda، غالبًا ستكون Pandas مثبتة مسبقًا، قد تحتاج فقط إلى:

conda install openpyxl

إنشاء DataFrame في Pandas وتجهيزه للتصدير

لنفترض أن لدينا بيانات مبيعات نريد إنشاء تقرير Excel احترافي لها. مثال بسيط لبيانات داخل كود بايثون:

import pandas as pd

data = {
    "التاريخ": ["2025-01-01", "2025-01-01", "2025-01-02", "2025-01-02"],
    "المنطقة": ["الرياض", "جدة", "الرياض", "جدة"],
    "المنتج": ["A", "B", "A", "B"],
    "الكمية": [10, 5, 7, 3],
    "السعر_للوحدة": [100, 150, 100, 150],
}

df = pd.DataFrame(data)

# إضافة عمود إجمالي المبيعات
df["إجمالي_المبيعات"] = df["الكمية"] * df["السعر_للوحدة"]

هنا قمنا بإنشاء DataFrame وإضافة عمود مشتق جديد وهو إجمالي_المبيعات. هذه خطوة نمطية قبل التصدير، حيث يمكنك تنفيذ أي تحليل أو تهيئة تحتاجها داخل Pandas قبل الانتقال إلى Excel.

التصدير إلى Excel باستخدام Pandas وOpenPyXL

Pandas توفر دالة to_excel للتصدير، ويمكننا تحديد محرك الكتابة (engine) ليكون OpenPyXL:

output_file = "تقرير_المبيعات.xlsx"
with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
    df.to_excel(writer, sheet_name="البيانات", index=False)

بهذا يتم إنشاء ملف تقرير_المبيعات.xlsx يحتوي على ورقة واحدة باسم "البيانات". لكن هنا التقرير ما زال "خام" بدون تنسيق أو صيغ متقدمة أو جداول Pivot.

إضافة التنسيقات باستخدام OpenPyXL

بعد تصدير البيانات بواسطة Pandas، يمكننا فتح الملف باستخدام OpenPyXL والتلاعب بالتنسيقات.

فتح ملف Excel والتعامل مع الورقة

from openpyxl import load_workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side

wb = load_workbook(output_file)
ws = wb["البيانات"]  # ورقة البيانات التي أنشأناها

تنسيق عناوين الأعمدة

نفترض أن عناوين الأعمدة في الصف الأول:

header_font = Font(bold=True, color="FFFFFF")
header_fill = PatternFill("solid", fgColor="4F81BD")
center_alignment = Alignment(horizontal="center", vertical="center")

for cell in ws[1]:  # الصف الأول
    cell.font = header_font
    cell.fill = header_fill
    cell.alignment = center_alignment

كما يمكن ضبط عرض الأعمدة تلقائيًا بناءً على طول المحتوى:

from openpyxl.utils import get_column_letter

for col in ws.columns:
    max_length = 0
    col_letter = get_column_letter(col[0].column)
    for cell in col:
        try:
            val_len = len(str(cell.value)) if cell.value is not None else 0
            if val_len > max_length:
                max_length = val_len
        except:
            pass
    ws.column_dimensions[col_letter].width = max_length + 2

إضافة حدود للخلايا

thin_border = Border(
    left=Side(style="thin"),
    right=Side(style="thin"),
    top=Side(style="thin"),
    bottom=Side(style="thin"),
)

for row in ws.iter_rows(min_row=1, max_row=ws.max_row, max_col=ws.max_column):
    for cell in row:
        cell.border = thin_border

بعد هذه الخطوات، سيبدو جدول البيانات في Excel أكثر احترافية: عناوين ملونة، محاذاة وسطية، وحدود واضحة، وأعمدة بعرض مناسب.

إضافة صيغ (Formulas) ديناميكية في Excel

أحيانًا نرغب في إضافة صيغ داخل Excel نفسه، مثل توابع SUM أو AVERAGE أو صيغ شرطيّة، بدلًا من حسابها في Pandas.

مثال: إضافة مجموع إجمالي المبيعات في أسفل العمود

نفترض أن عمود إجمالي_المبيعات هو العمود F (يمكن التأكد منه من الملف أو برمجيًا). سنضيف مجموع القيم في الصف الذي يلي آخر صف بيانات.

# تحديد رقم آخر صف بيانات
last_row = ws.max_row

# عنوان عمود إجمالي_المبيعات (نفترض أنه في العمود F = 6)
total_col_letter = "F"
total_cell = f"{total_col_letter}{last_row + 1}"

# إضافة صيغة SUM
ws[total_cell] = f"=SUM({total_col_letter}2:{total_col_letter}{last_row})"
ws[total_cell].font = Font(bold=True)
ws[total_cell].number_format = "#,##0.00"

يمكنك كذلك إضافة صيغ أخرى مثل نسبة مئوية أو متوسط:

avg_cell = f"{total_col_letter}{last_row + 2}"
ws[avg_cell] = f"=AVERAGE({total_col_letter}2:{total_col_letter}{last_row})"
ws[avg_cell].font = Font(italic=True)

إنشاء Pivot Table (جدول Pivot) باستخدام بايثون

جداول Pivot من أقوى أدوات Excel لتحليل البيانات، مثل تجميع المبيعات حسب المنطقة، أو المنتج، أو التاريخ. إنشاء Pivot Table مباشرة عبر OpenPyXL ما زال محدودًا ومعقدًا نسبيًا، لكن هناك أسلوب عملي:

  1. إنشاء Pivot داخل Pandas باستخدام pivot_table.
  2. تصدير نتيجة الـ Pivot إلى ورقة جديدة في Excel.
  3. تنسيق النتيجة لتبدو كجدول Pivot تقليدي.

1. إنشاء Pivot باستخدام Pandas

مثال: مجموع إجمالي المبيعات حسب المنطقة والمنتج:

pivot_df = pd.pivot_table(
    df,
    index="المنطقة",
    columns="المنتج",
    values="إجمالي_المبيعات",
    aggfunc="sum",
    fill_value=0,
)

print(pivot_df)

2. تصدير Pivot إلى ورقة جديدة في نفس ملف Excel

سنكتب هذا الـ Pivot في نفس الملف تقرير_المبيعات.xlsx في ورقة باسم "Pivot_المبيعات":

with pd.ExcelWriter(output_file, engine="openpyxl", mode="a", if_sheet_exists="replace") as writer:
    pivot_df.to_excel(writer, sheet_name="Pivot_المبيعات")

لاحظ استخدام mode="a" لإضافة ورقة جديدة إلى ملف موجود، وif_sheet_exists="replace" لاستبدال الورقة إذا كانت موجودة سابقًا.

3. تنسيق ورقة الـ Pivot

wb = load_workbook(output_file)
pivot_ws = wb["Pivot_المبيعات"]

# تنسيق العناوين
for cell in pivot_ws[1]:
    cell.font = Font(bold=True, color="FFFFFF")
    cell.fill = PatternFill("solid", fgColor="9BBB59")
    cell.alignment = Alignment(horizontal="center", vertical="center")

# توسيع الأعمدة
from openpyxl.utils import get_column_letter

for col in pivot_ws.columns:
    max_length = 0
    col_letter = get_column_letter(col[0].column)
    for cell in col:
        val_len = len(str(cell.value)) if cell.value is not None else 0
        if val_len > max_length:
            max_length = val_len
    pivot_ws.column_dimensions[col_letter].width = max_length + 2

wb.save(output_file)

بهذه الطريقة، حصلت على ورقة مخصصة تعرض تجميعات مبيعاتك بطريقة تشبه Pivot Table، لكن تم إنشاؤها بالكامل عبر Pandas وبايثون.

إنشاء أكثر من ورقة (Sheet) لتقرير منظم

من الجيد في التقارير الاحترافية أن تكون البيانات والتحليلات مقسمة على عدة أوراق، مثل:

  • ورقة "البيانات": تحتوي الجدول الخام أو شبه الخام.
  • ورقة "Pivot_المبيعات": جداول Pivot مختلفة.
  • ورقة "ملخص_التقرير": تحتوي أرقامًا أساسية وصيغًا ورسومًا بيانية (يمكنك توليدها ربما بصور من Matplotlib).

مثال بسيط لإضافة ملخص:

from openpyxl import Workbook

wb = load_workbook(output_file)

# إنشاء ورقة ملخص إن لم تكن موجودة
if "ملخص_التقرير" not in wb.sheetnames:
    summary_ws = wb.create_sheet("ملخص_التقرير")
else:
    summary_ws = wb["ملخص_التقرير"]

summary_ws["A1"] = "ملخص تقرير المبيعات"
summary_ws["A1"].font = Font(bold=True, size=16)

summary_ws["A3"] = "إجمالي المبيعات الكلي:"
summary_ws["A3"].font = Font(bold=True)

# ربط الخلية بصيغة تشير إلى مجموع إجمالي_المبيعات في ورقة البيانات
summary_ws["B3"] = "=SUM(البيانات!F2:البيانات!F1048576)"

wb.save(output_file)

هنا استخدمنا صيغة داخل Excel تربط الملخص ببيانات ورقة "البيانات"، وبالتالي إذا تم تحديث البيانات وأعيد تشغيل السكربت، يتم تحديث الأرقام تلقائيًا.

نصائح عملية لإنشاء تقارير Excel احترافية

خلاصة: قوة Python Excel OpenPyXL Pandas في التقارير

باستخدام مزيج Python Excel OpenPyXL Pandas تستطيع الانتقال من تقارير Excel يدوية ومملة إلى تقارير آلية احترافية، قابلة للتكرار والتطوير بسهولة. Pandas تمنحك مرونة معالجة وتحليل البيانات، وOpenPyXL تمنحك تحكمًا عميقًا في كل ما يتعلق بملف Excel من صيغ وتنسيقات وجداول وعناصر متقدمة.

ابدأ بخطوات صغيرة: أنشئ DataFrame بسيط، صدّره إلى Excel، ثم أضف بعض التنسيقات، وبعدها طوّر تدريجيًا بإضافة صيغ، Pivot، وملخصات. مع الوقت ستتمكن من بناء منظومة تقارير كاملة تواكب احتياجاتك العملية وتختصر عليك وقتًا وجهدًا كبيرين.

حول المحتوى:

شرح كيفية إنشاء وتنسيق ملفات Excel ديناميكية وربطها ببيانات Pandas وإضافة صيغ وتنسيقات وجداول Pivot تلقائياً.

هل كان هذا مفيدًا لك؟

أضف تعليقك