اتوماسیون اکسل با پایتون و pandas
اگر هر هفته چند ساعت صرف کپیکردن، فیلترکردن و جمعزدن در اکسل میکنید، این آموزش برای شماست. من در محیط صنعتی دیدهام که همین چند خط پایتون، کار یک روزِ تمام را به چند ثانیه رسانده — نمونهاش ابزار قیمتگذاری پویا در نمونهکارهایم.
نصب pandas
pip install pandas openpyxl
openpyxl موتور خواندن و نوشتن فایلهای .xlsx است و pandas از آن استفاده میکند.
سناریوی واقعی: گزارش فروش
فرض کنید فایل sales.xlsx را دارید با ستونهای: تاریخ، فروشنده، محصول، تعداد، قیمت واحد. میخواهیم گزارش جمع فروش هر فروشنده را بسازیم.
قدم اول: خواندن فایل
import pandas as pd
df = pd.read_excel("sales.xlsx")
print(df.head()) # ۵ ردیف اول
print(len(df), "ردیف")
df (مخفف DataFrame) کل جدول شماست — مثل یک شیت اکسل داخل پایتون.
قدم دوم: ستون محاسباتی
df["مبلغ کل"] = df["تعداد"] * df["قیمت واحد"]
همین یک خط، برای همه ردیفها — چه ۱۰ ردیف چه ۱۰۰ هزار ردیف — ستون جدید میسازد.
قدم سوم: فیلتر و جمعبندی
# فقط فروشهای بالای ۵ میلیون
big_sales = df[df["مبلغ کل"] > 5_000_000]
# جمع فروش هر فروشنده (معادل Pivot Table)
report = df.groupby("فروشنده")["مبلغ کل"].sum().sort_values(ascending=False)
print(report)
groupby همان Pivot Table اکسل است، فقط برنامهریزیپذیر و تکرارشونده.
قدم چهارم: خروجی گزارش
report.to_excel("report.xlsx", sheet_name="گزارش فروش")
print("گزارش ساخته شد ✅")
جادوی واقعی: چند فایل با هم
قدرت اصلی وقتی معلوم میشود که ۳۰ فایل اکسل ماهانه دارید:
from pathlib import Path
import pandas as pd
all_months = []
for file in Path("monthly-reports").glob("*.xlsx"):
month_df = pd.read_excel(file)
month_df["فایل"] = file.stem
all_months.append(month_df)
total = pd.concat(all_months)
total.groupby("فروشنده")["مبلغ کل"].sum().to_excel("yearly-report.xlsx")
سی فایل، یک گزارش سالانه، چند ثانیه.
کی سراغ پایتون بیاییم و کی در اکسل بمانیم؟
- کار یکباره و کوچک؟ خود اکسل سریعتر است
- کار تکراری (هفتگی/ماهانه) یا چندفایلی؟ پایتون بنویسید و هر بار فقط اجرا کنید
- ورودی از منابع دیگر (وب، دیتابیس، API) میآید؟ قطعاً پایتون
تمرین
از فایل فروش خودتان (یا یک فایل ساختگی) گزارشی بسازید که پرفروشترین محصول هر ماه را نشان بدهد. راهنمایی: ستون تاریخ را با pd.to_datetime تبدیل کنید و از df["تاریخ"].dt.month برای گروهبندی استفاده کنید.