FA-TOOLS — Header Component

آموزش کار با Excel در پایتون با openpyxl

رفیق برنامه‌نویس، اگه تا حالا با فایل‌های اکسل توی پایتون کلانجار رفتی و دنبال یه راه حل ساده و قدرتمند بودی، درست اومدی! OpenPyXL رفیق شفیقته برای مدیریت این فایل‌ها. تو این راهنمای جامع، قدم به قدم یادت میدیم چطور با این کتابخونه جادویی، هر کاری از خوندن داده‌ها گرفته تا ساختن گزارش‌های خفن رو انجام بدی. آماده‌ای که با فایل‌های Excel خداحافظی کنی و همه کارها رو با کد خودت مدیریت کنی؟ پس بزن بریم!
همین الان برای تجهیز ابزار برنامه‌نویسیتون، یه سر به فروشگاه ابزارهای برنامه‌نویسی ما بزنید و دنیایی از امکانات رو کشف کنید!
برای مشاوره و پشتیبانی تلفنی می‌تونید با شماره 09202232789 تماس بگیرید.

نقشه راه تسلط بر OpenPyXL 🚀

آموزش کار با Excel در پایتون با openpyxl — تصویر 1

✨ شروع کار

  • ✅ نصب کتابخانه
  • ✅ مقدمه‌ای بر ساختار Excel
  • ✅ ایجاد و باز کردن فایل

📝 خواندن و نوشتن

  • ✅ دسترسی به سلول‌ها
  • ✅ پیمایش داده‌ها
  • ✅ ذخیره تغییرات

🎨 فرمت و پیشرفته

  • ✅ استایل‌دهی سلول‌ها
  • ✅ فرمول‌نویسی
  • ✅ کار با شیت‌های مختلف

🛠️ حل مشکل

  • ✅ عیب‌یابی سریع
  • ✅ نکات بهینه‌سازی
  • ✅ پرسش‌های متداول

فایل‌های Excel هنوز هم ابزار خیلی محبوبی برای ذخیره و مدیریت داده‌ها هستن. از گزارش‌های مالی تا لیست دانشجوها، همه جا رد پاشون دیده میشه. اما وقتی حجم کار زیاد میشه یا نیاز به اتوماسیون پیدا می‌کنیم، دیگه کار دستی جواب نمیده. اینجا پایتون و کتابخونه خفن OpenPyXL به دادمون میرسن. با استفاده از این کتابخونه، می‌تونیم با قدرت برنامه‌نویسی پایتون، فایل‌های Excel رو خودکار بسازیم، بخونیم، ویرایش کنیم و حتی فرمت‌دهی کنیم. دیگه لازم نیست ساعت‌ها وقتت رو پای کارهای تکراری اکسل هدر بدی. OpenPyXL بهت این امکان رو میده که با چند خط کد، کارهایی رو انجام بدی که با دست کلی زمان میبرن. اگه دنبال کدهای آماده پایتون هستی، حتماً اونجا رو هم ببین!

نصب و آماده‌سازی OpenPyXL

آموزش کار با Excel در پایتون با openpyxl — تصویر 2

قبل از اینکه بتونیم هر کاری با OpenPyXL انجام بدیم، اول باید این کتابخونه رو روی سیستممون نصب کنیم. نگران نباش، کار خیلی ساده‌ایه و با یه دستور کوچیک انجام میشه.

نصب با pip

ترمینال یا Command Prompt رو باز کن و دستور زیر رو وارد کن:

pip install openpyxl

بعد از نصب موفقیت‌آمیز، حالا می‌تونیم OpenPyXL رو توی اسکریپت‌هامون import کنیم.

وارد کردن کتابخانه

برای شروع کار، کافیه OpenPyXL رو توی فایل پایتونیت import کنی:

import openpyxl

اصول اولیه: خواندن اطلاعات از فایل Excel

آموزش کار با Excel در پایتون با openpyxl — تصویر 3

یکی از مهم‌ترین کارها، خوندن داده‌ها از فایل‌های Excel موجوده. OpenPyXL این کار رو خیلی راحت کرده.

باز کردن یک ورک‌بوک (Workbook)

اولین قدم، باز کردن فایل Excel مدنظرتون هست. فرض می‌کنیم یه فایل به اسم `example.xlsx` داریم.


from openpyxl import load_workbook

# باز کردن یک فایل اکسل موجود
workbook = load_workbook('example.xlsx')
print("فایل اکسل با موفقیت باز شد!")
    

انتخاب یک شیت (Worksheet)

بعد از باز کردن ورک‌بوک، باید شیتی رو که می‌خوای باهاش کار کنی انتخاب کنی. می‌تونی از طریق نام شیت یا فعال‌ترین شیت این کار رو انجام بدی.


# انتخاب شیت فعال
sheet = workbook.active
print(f"شیت فعال: {sheet.title}")

# انتخاب شیت با نام مشخص
# اگر شیتی با این نام وجود نداشته باشد، خطا می‌دهد
sheet_by_name = workbook['Sheet1']
print(f"شیت 'Sheet1': {sheet_by_name.title}")
    

دسترسی به سلول‌ها (Cells)

حالا که شیت رو انتخاب کردی، می‌تونی به سلول‌های مختلف دسترسی پیدا کنی.

مثال: خواندن یک سلول خاص


# دسترسی به سلول A1
cell_a1 = sheet['A1']
print(f"مقدار سلول A1: {cell_a1.value}")

# دسترسی به سلول با استفاده از ردیف و ستون
cell_b2 = sheet.cell(row=2, column=2)
print(f"مقدار سلول B2: {cell_b2.value}")
    

مثال: خواندن ردیف‌ها و ستون‌ها


# خواندن یک ردیف کامل (از ردیف اول)
for cell in sheet[1]:
    print(cell.value, end=" | ")
print("n")

# خواندن یک ستون کامل (از ستون اول)
for cell in sheet['A']:
    print(cell.value)
    

پیمایش داده‌ها

برای پردازش کل داده‌های یک شیت، معمولاً نیاز داریم که روی ردیف‌ها یا ستون‌ها پیمایش کنیم.

مثال: تکرار روی ردیف‌ها


print("خواندن همه ردیف‌ها:")
for row in sheet.iter_rows():
    for cell in row:
        print(cell.value, end="t")
    print()

print("nخواندن ردیف‌ها با محدودیت (مثلا از ردیف 2 تا 5، ستون A تا C):")
for row in sheet.iter_rows(min_row=2, max_row=5, min_col=1, max_col=3):
    for cell in row:
        print(cell.value, end="t")
    print()
    

نوشتن اطلاعات در فایل Excel

OpenPyXL فقط برای خوندن نیست؛ شما می‌تونید فایل‌های Excel جدید بسازید یا داده‌ها رو به فایل‌های موجود اضافه کنید.

ساخت یک ورک‌بوک جدید

برای ساخت یه فایل Excel کاملاً جدید، فقط کافیه یه آبجکت Workbook بسازی.


from openpyxl import Workbook

# ساخت یک ورک‌بوک جدید
new_workbook = Workbook()
new_sheet = new_workbook.active
new_sheet.title = "داده‌های جدید"
print(f"ورک‌بوک جدید با شیت '{new_sheet.title}' ساخته شد.")
    

افزودن داده به سلول‌ها

مثل خوندن، برای نوشتن هم می‌تونی به سلول‌ها مستقیماً دسترسی پیدا کنی.

مثال: نوشتن در یک سلول خاص


new_sheet['A1'] = "نام"
new_sheet['B1'] = "سن"
new_sheet.cell(row=2, column=1, value="علی")
new_sheet.cell(row=2, column=2, value=30)
new_sheet['A3'] = "سارا"
new_sheet['B3'] = 25
print("داده‌ها به شیت اضافه شدند.")
    

مثال: افزودن ردیف‌های جدید

متد `append()` برای اضافه کردن یک ردیف کامل از داده‌ها خیلی کاربردیه.


data = [
    ["محصول", "قیمت", "تعداد"],
    ["لپ تاپ", 1500, 5],
    ["موس", 25, 20],
    ["کیبورد", 75, 10]
]

for row_data in data:
    new_sheet.append(row_data)
print("ردیف‌های جدید به شیت اضافه شدند.")
    

ذخیره ورک‌بوک

یادت نره که بعد از انجام تغییرات، حتماً فایل رو ذخیره کنی، وگرنه همه زحماتت به هدر میره!


new_workbook.save("my_new_file.xlsx")
print("فایل 'my_new_file.xlsx' با موفقیت ذخیره شد.")
    

کار با شیت‌ها (Worksheets)

مدیریت شیت‌ها توی یک ورک‌بوک چند شیته، یک مهارت مهم دیگه است.

ساخت شیت جدید


new_sheet2 = new_workbook.create_sheet("گزارش ماهانه")
print(f"شیت '{new_sheet2.title}' ایجاد شد.")
    

تغییر نام شیت


new_sheet.title = "لیست کالاها"
print(f"نام شیت به '{new_sheet.title}' تغییر یافت.")
    

حذف شیت


# workbook.remove(new_sheet2)
# print(f"شیت '{new_sheet2.title}' حذف شد.")
# (فعلا این خط رو کامنت می‌کنیم تا فایل رو خراب نکنیم!)
    

فرمت‌دهی سلول‌ها و داده‌ها

برای اینکه گزارش‌هات حرفه‌ای و چشم‌نواز باشن، باید بتونی سلول‌ها رو فرمت‌دهی کنی. OpenPyXL امکانات کاملی برای این کار در اختیارت میذاره.

تغییر فونت و رنگ

با کلاس‌های `Font` و `PatternFill` می‌تونی ظاهر سلول‌ها رو عوض کنی.


from openpyxl.styles import Font, PatternFill

# اعمال فونت و رنگ
header_cell = new_sheet['A1']
header_cell.font = Font(name='B Titr', size=14, bold=True, color="FF0000") # رنگ قرمز
header_cell.fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid") # پس زمینه زرد
print("فرمت‌دهی سلول A1 انجام شد.")
    

تراز بندی متن

با کلاس `Alignment` می‌تونی متن رو تراز بندی (چپ‌چین، راست‌چین، وسط‌چین) کنی.


from openpyxl.styles import Alignment

new_sheet['B1'].alignment = Alignment(horizontal="center", vertical="center")
print("تراز بندی سلول B1 انجام شد.")
    

ادغام سلول‌ها

برای ساختن تیترهای عریض یا سازماندهی بهتر، می‌تونی چند سلول رو با هم ادغام کنی.


new_sheet.merge_cells('A5:C5')
new_sheet['A5'] = "گزارش فروش سه ماهه"
new_sheet['A5'].alignment = Alignment(horizontal="center", vertical="center")
new_sheet['A5'].font = Font(size=16, bold=True)
print("سلول‌های A5:C5 ادغام شدند.")
    

تنظیم عرض ستون و ارتفاع ردیف

با این قابلیت می‌تونی ظاهر شیتت رو حسابی مرتب کنی.


new_sheet.column_dimensions['A'].width = 20
new_sheet.row_dimensions[1].height = 30
print("عرض ستون A و ارتفاع ردیف 1 تنظیم شد.")
    

جدول آموزشی: روش‌های اصلی فرمت‌دهی در OpenPyXL

نوع فرمت‌دهی کاربرد و مثال
Font تنظیمات مربوط به ظاهر متن (سایز، رنگ، بولد، ایتالیک).
cell.font = Font(bold=True, color="FF0000")
PatternFill رنگ پس‌زمینه سلول.
cell.fill = PatternFill(fill_type="solid", start_color="FFC7CE")
Border ایجاد حاشیه برای سلول‌ها.
cell.border = Border(left=Side(), right=Side())
Alignment تراز بندی افقی و عمودی متن، چرخش متن.
cell.alignment = Alignment(horizontal="center")
NumberFormat قالب‌بندی اعداد (تاریخ، پول، درصد).
cell.number_format = '#,##0.00'

فرمول‌نویسی و توابع Excel در OpenPyXL

یکی از قابلیت‌های قدرتمند Excel، فرمول‌هاشه. OpenPyXL بهت اجازه میده که فرمول‌ها رو توی سلول‌ها وارد کنی و حتی نتیجه‌شون رو بخونی.

اضافه کردن فرمول‌ها


# فرض کنید در سلول B6 و B7 اعدادی داریم که میخواهیم جمع کنیم
new_sheet['B6'] = 100
new_sheet['B7'] = 200
new_sheet['B8'] = "=SUM(B6:B7)" # اضافه کردن فرمول جمع
print("فرمول جمع در سلول B8 اضافه شد.")

# برای دیدن نتیجه فرمول باید فایل رو باز کنی
# اگر بخواهی نتیجه فرمول رو با پایتون بخونی، باید workbook رو در حالت data_only=True لود کنی
# یا بعد از ذخیره، با اکسل باز و ذخیره کنی.
    

کار با تاریخ و زمان

Excel تاریخ و زمان رو به صورت عدد ذخیره می‌کنه. OpenPyXL این تبدیل رو برات انجام میده.


import datetime
from openpyxl.styles import numbers

new_sheet['C1'] = datetime.date(2023, 10, 26)
new_sheet['C1'].number_format = numbers.FORMAT_DATE_YYYYMMDD2
print("تاریخ به سلول C1 اضافه و فرمت شد.")
    

نمودارها و تصاویر (جایگزین بصری)

گرچه OpenPyXL امکاناتی برای کار با نمودارها و تصاویر داره، اما پیاده‌سازی اونها کمی پیچیده است و معمولاً برای کارهای خیلی تخصصی استفاده میشه. برای ساخت نمودارهای پیشرفته، کتابخانه‌هایی مثل Matplotlib یا Seaborn در پایتون خیلی قوی‌تر و منعطف‌تر هستن و بعد می‌تونی خروجی‌شون رو به عنوان تصویر به اکسل اضافه کنی.

💡 نکته مهم برای نمودارها و اینفوگرافیک‌ها

برای اینفگرافیک‌های پیچیده یا نمودارهای تعاملی، استفاده از ابزارهای تخصصی‌تر یا کتابخانه‌هایی مثل Matplotlib و Plotly در پایتون توصیه میشه. بعد از تولید اینفوگرافیک با این ابزارها، می‌تونی اونها رو به عنوان عکس به فایل اکسل اضافه کنی. OpenPyXL بیشتر برای مدیریت داده‌ها و ساختار Excel عالیه تا طراحی گرافیکی پیچیده.

به جای تمرکز بر ایجاد مستقیم نمودار با OpenPyXL، بهتره داده‌ها رو آماده کنی و سپس از پایتون برای تولید فایل‌های تصویری (PNG, JPG) نمودار استفاده کنی و اونا رو به اکسل اضافه کنی.

مثال عملی: پردازش یک فایل اکسل

بیا یه سناریو واقعی رو با هم پیاده‌سازی کنیم. فرض کن یه فایل اکسل داری که اطلاعات دانش‌آموزان و نمراتشون توشه و می‌خوایم معدلشون رو حساب کنیم و توی یه ستون جدید بنویسیم.

سناریو: محاسبه معدل دانش‌آموزان

اول یه فایل `students.xlsx` با این محتوا بساز (اگه نداری، دستی ایجاد کن):

Sheet1:
نام     درس1   درس2   درس3
علی     18     17     19
سارا    15     16     14
رضا     20     19     18

کد نمونه


from openpyxl import load_workbook
from openpyxl.styles import Font

try:
    workbook = load_workbook('students.xlsx')
    sheet = workbook.active

    # اضافه کردن سربرگ "معدل" در ستون بعدی
    sheet.cell(row=1, column=sheet.max_column + 1, value="معدل").font = Font(bold=True)

    # پیمایش روی ردیف‌ها از ردیف دوم (بعد از سربرگ)
    for row_index in range(2, sheet.max_row + 1):
        # خواندن نمرات
        grade1 = sheet.cell(row=row_index, column=2).value
        grade2 = sheet.cell(row=row_index, column=3).value
        grade3 = sheet.cell(row=row_index, column=4).value

        # محاسبه معدل
        if all(isinstance(g, (int, float)) for g in [grade1, grade2, grade3]):
            average = (grade1 + grade2 + grade3) / 3
            # نوشتن معدل در ستون جدید
            sheet.cell(row=row_index, column=sheet.max_column, value=round(average, 2))
        else:
            sheet.cell(row=row_index, column=sheet.max_column, value="خطا در نمرات")

    # ذخیره فایل جدید
    workbook.save('students_with_average.xlsx')
    print("فایل 'students_with_average.xlsx' با موفقیت ایجاد شد و معدل‌ها محاسبه گردید.")

except FileNotFoundError:
    print("خطا: فایل 'students.xlsx' یافت نشد. لطفا مطمئن شوید فایل در مسیر صحیح قرار دارد.")
except Exception as e:
    print(f"خطایی رخ داد: {e}")
    

این مثال نشون میده که چقدر راحت می‌تونی یه کار روتین اکسل رو با پایتون اتوماسیون کنی و وقتت رو برای کارهای مهم‌تر آزاد کنی. فراموش نکن که برای کدهای آماده و اسنیپت‌های بیشتر می‌تونی به بخش اسنیپت‌های ما سر بزنی.

نکات پیشرفته و بهترین شیوه‌ها

برای کارایی بهتر و جلوگیری از مشکلات احتمالی، این نکات رو یادت باشه:

کار با فایل‌های بزرگ

اگه با فایل‌های اکسل خیلی بزرگ سر و کار داری که رم سیستمت رو درگیر می‌کنن، می‌تونی از حالت “read-only” و “write-only” یا “optimised reader/writer” استفاده کنی.


from openpyxl import load_workbook, Workbook

# برای خواندن فایل‌های بزرگ
read_only_wb = load_workbook('large_file.xlsx', read_only=True)
for row in read_only_wb.active.iter_rows():
    # پردازش ردیف‌ها بدون لود کردن کل فایل در حافظه
    pass

# برای نوشتن فایل‌های بزرگ
write_only_wb = Workbook(write_only=True)
ws = write_only_wb.create_sheet()
for row_data in some_large_dataset:
    ws.append(row_data)
write_only_wb.save('new_large_file.xlsx')
    

مدیریت خطاها

همیشه کدنویسیت رو با بلاک‌های `try-except` بنویس تا خطاهایی مثل پیدا نشدن فایل، مشکل در دسترسی یا فرمت اشتباه داده‌ها رو مدیریت کنی. این کار باعث میشه برنامه‌ات پایدارتر باشه.

عملکرد (Performance)

برای عملکرد بهتر، تا جای ممکن از دسترسی مستقیم به سلول‌ها (مثلا `sheet[‘A1’]`) توی حلقه‌های تکرار بزرگ خودداری کن. بهتره از متدهایی مثل `iter_rows()` یا `iter_cols()` استفاده کنی که بهینه‌تر هستن. همچنین، هر بار که یک سلول رو ویرایش می‌کنی، تغییرات به سرعت اعمال میشن، اما برای ذخیره نهایی، فقط یکبار `workbook.save()` رو صدا بزن.

عیب‌یابی سریع (Troubleshooting)

هر برنامه‌نویسی با مشکل روبرو میشه. این بخش به رایج‌ترین مشکلاتی که ممکنه با OpenPyXL برخورد کنی، می‌پردازه.

⛔️ مشکل ۱: FileNotFoundError

راه حل: مطمئن شو که فایل اکسل در مسیر درستی قرار داره. اگه فایل کنار اسکریپت پایتونته، فقط اسمش کافیه. وگرنه باید مسیر کاملش رو بدی (مثلاً 'C:/Users/User/Desktop/my_file.xlsx'). همچنین، اگه فایل رو باز گذاشتی، ببندش.

⛔️ مشکل ۲: PermissionError: [Errno 13] Permission denied

راه حل: این خطا معمولاً وقتی رخ میده که فایل اکسل مورد نظر توسط برنامه دیگه‌ای (مثل خود Excel) بازه. قبل از اجرای اسکریپت پایتون، مطمئن شو که فایل مورد نظر بسته‌ است. همچنین، بررسی کن که اسکریپتت دسترسی لازم برای نوشتن/خواندن در اون مسیر رو داره یا نه. (برای سیستم‌عامل‌های ویندوز، گاهی نیاز به اجرای ترمینال به صورت Administrator داری.)

⛔️ مشکل ۳: Data type issues (مثلاً خواندن عدد به جای تاریخ)

راه حل: OpenPyXL سعی می‌کنه نوع داده‌ها رو درست تشخیص بده، اما گاهی اوقات نیاز به تبدیل دستی داری. برای تاریخ، می‌تونی از ماژول datetime پایتون استفاده کنی. برای اعداد، مطمئن شو که مقادیر قبل از عملیات ریاضی به int یا float تبدیل شدن.

⛔️ مشکل ۴: سلول‌ها هنگام خواندن خالی هستند (cell.value is None)

راه حل: مطمئن شو که به شیت و سلول درستی دسترسی داری. گاهی اوقات فرمول‌ها در اکسل هنوز محاسبه نشده‌اند. برای خواندن نتیجه فرمول‌ها، باید فایل را با load_workbook('file.xlsx', data_only=True) باز کنی. این کار فقط مقادیر (نتیجه فرمول‌ها) را می‌خواند، نه خود فرمول‌ها را.

⛔️ مشکل ۵: استایل‌ها اعمال نمی‌شوند یا درست نمایش داده نمی‌شوند

راه حل: مطمئن شو که کلاس‌های استایل (مثل Font، PatternFill) را از openpyxl.styles import کرده‌ای. همچنین، برخی استایل‌های پیچیده ممکن است فقط در نسخه‌های جدیدتر Excel به درستی رندر شوند. همیشه بعد از اعمال استایل، فایل را ذخیره کن و با یک برنامه Excel باز کن تا نتیجه را ببینی.

پرسش‌های متداول (FAQ)

آیا OpenPyXL فقط برای فایل‌های .xlsx است؟

بله، OpenPyXL فقط برای فرمت .xlsx (Office Open XML) طراحی شده است. برای کار با فرمت‌های قدیمی‌تر مثل .xls باید از کتابخانه‌های دیگری مانند xlrd و xlwt استفاده کنید.

آیا می‌توانم ماکروها (Macros) را با OpenPyXL مدیریت کنم؟

OpenPyXL برای مدیریت ماکروها (VBA) طراحی نشده و نمی‌تواند کدهای ماکرو را ایجاد یا ویرایش کند. تمرکز آن بر روی داده‌ها و ساختار فایل .xlsx است. اگر نیاز به کار با ماکروها دارید، باید از روش‌های دیگری مانند استفاده از pywin32 در ویندوز استفاده کنید که امکان تعامل مستقیم با برنامه Excel را فراهم می‌کند.

تفاوت OpenPyXL با pandas چیست؟

pandas یک کتابخانه قدرتمند برای تحلیل و دستکاری داده‌ها است که قابلیت خواندن و نوشتن فایل‌های اکسل را نیز دارد، اما با رویکرد DataFrame. OpenPyXL بیشتر برای مدیریت مستقیم ساختار و ظاهر فایل‌های اکسل (شیت‌ها، سلول‌ها، فرمت‌دهی، فرمول‌ها) طراحی شده است، بدون اینکه لایه پیچیده‌ای از تحلیل داده را اضافه کند. معمولاً در پروژه‌های بزرگتر، از pandas برای پردازش داده‌ها و سپس از OpenPyXL (یا موتور اکسل داخلی pandas) برای خروجی نهایی به اکسل استفاده می‌شود.

سخن پایانی

دیدید که OpenPyXL چقدر می‌تونه کار با فایل‌های Excel رو توی پایتون راحت و قدرتمند کنه؟ از خوندن و نوشتن داده‌ها گرفته تا فرمت‌دهی و حتی فرمول‌نویسی، همه این کارها با چند خط کد ساده قابل انجام هستن. با استفاده از این کتابخونه، می‌تونی کارهای تکراری رو اتوماسیون کنی و وقت بیشتری برای برنامه‌نویسی خلاقانه داشته باشی. امیدوارم این آموزش جامع به دردتون خورده باشه و بهتون کمک کنه پروژه‌های هیجان‌انگیزتری رو با پایتون و Excel انجام بدید.

راستی، اگه دنبال کدهای HTML، کدهای CSS یا کدهای JavaScript برای وبسایتت هستی، یا حتی اگه با وردپرس کار می‌کنی و اسنیپت‌های مفیدی لازم داری، حتماً یه سر به بخش کدهای آماده و اسنیپت‌های ما بزن. اونجا کلی منبع ارزشمند برای توسعه‌دهنده‌ها آماده کردیم. همیشه در حال یادگیری و کدنویسی باش!

Table of Contents

آخرین نوشته‌ها