حول المحتوى:
شرح كيفية إنشاء وتنسيق ملفات Excel ديناميكية وربطها ببيانات Pandas وإضافة صيغ وتنسيقات وجداول Pivot تلقائياً.
ملفات Excel ما زالت واحدة من أهم الأدوات في تحليل البيانات وإعداد التقارير في الشركات الصغيرة والكبيرة. لكن إعداد التقارير يدويًا يتطلب وقتًا كبيرًا، ويكون معرضًا للأخطاء، خصوصًا عندما تتكرر نفس التقارير بشكل يومي أو أسبوعي.
بايثون مع مكتبات مثل Pandas وOpenPyXL توفر لك طريقة قوية ومرنة لإنشاء تقارير Excel احترافية، ديناميكية، قابلة للتحديث تلقائيًا، مع صيغ وتنسيقات وجداول Pivot (Pivot Tables) جاهزة بضغطة زر.
في هذا المقال سنشرح خطوة بخطوة كيفية استخدام Python Excel OpenPyXL Pandas لإنشاء ملفات Excel متقدمة، بدءًا من التعامل مع البيانات في Pandas، مرورًا بتصديرها إلى Excel، ثم إضافة الصيغ والتنسيقات وجداول Pivot بشكل برمجي.
Pandas هي الأداة الأساسية للتعامل مع البيانات في بايثون. تسمح لك بقراءة بيانات من ملفات Excel وCSV وقواعد البيانات، وتنظيفها وتحليلها بسهولة.
OpenPyXL مسؤولة عن التعامل المباشر مع ملفات Excel (بصيغة .xlsx). تمنحك تحكمًا في:
التكامل بين Pandas وOpenPyXL هو ما يجعل إنشاء تقارير Excel الاحترافية أمرًا قويًا ومرنًا في نفس الوقت.
أول خطوة هي تثبيت المكتبات اللازمة:
pip install pandas openpyxl في حال كنت تستخدم بيئة عمل علميّة مثل Anaconda، غالبًا ستكون Pandas مثبتة مسبقًا، قد تحتاج فقط إلى:
conda install openpyxl لنفترض أن لدينا بيانات مبيعات نريد إنشاء تقرير 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.
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.
بعد تصدير البيانات بواسطة Pandas، يمكننا فتح الملف باستخدام OpenPyXL والتلاعب بالتنسيقات.
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 أكثر احترافية: عناوين ملونة، محاذاة وسطية، وحدود واضحة، وأعمدة بعرض مناسب.
أحيانًا نرغب في إضافة صيغ داخل 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 من أقوى أدوات Excel لتحليل البيانات، مثل تجميع المبيعات حسب المنطقة، أو المنتج، أو التاريخ. إنشاء Pivot Table مباشرة عبر OpenPyXL ما زال محدودًا ومعقدًا نسبيًا، لكن هناك أسلوب عملي:
pivot_table.مثال: مجموع إجمالي المبيعات حسب المنطقة والمنتج:
pivot_df = pd.pivot_table(
df,
index="المنطقة",
columns="المنتج",
values="إجمالي_المبيعات",
aggfunc="sum",
fill_value=0,
)
print(pivot_df) سنكتب هذا الـ 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" لاستبدال الورقة إذا كانت موجودة سابقًا.
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 وبايثون.
من الجيد في التقارير الاحترافية أن تكون البيانات والتحليلات مقسمة على عدة أوراق، مثل:
مثال بسيط لإضافة ملخص:
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 تربط الملخص ببيانات ورقة "البيانات"، وبالتالي إذا تم تحديث البيانات وأعيد تشغيل السكربت، يتم تحديث الأرقام تلقائيًا.
تقرير_المبيعات_2025-01-02.xlsx لوضوح الأرشفة.باستخدام مزيج Python Excel OpenPyXL Pandas تستطيع الانتقال من تقارير Excel يدوية ومملة إلى تقارير آلية احترافية، قابلة للتكرار والتطوير بسهولة. Pandas تمنحك مرونة معالجة وتحليل البيانات، وOpenPyXL تمنحك تحكمًا عميقًا في كل ما يتعلق بملف Excel من صيغ وتنسيقات وجداول وعناصر متقدمة.
ابدأ بخطوات صغيرة: أنشئ DataFrame بسيط، صدّره إلى Excel، ثم أضف بعض التنسيقات، وبعدها طوّر تدريجيًا بإضافة صيغ، Pivot، وملخصات. مع الوقت ستتمكن من بناء منظومة تقارير كاملة تواكب احتياجاتك العملية وتختصر عليك وقتًا وجهدًا كبيرين.
شرح كيفية إنشاء وتنسيق ملفات Excel ديناميكية وربطها ببيانات Pandas وإضافة صيغ وتنسيقات وجداول Pivot تلقائياً.
مساحة اعلانية