समझिए
1. एक DataFrame, एक फ़ाइल
summary.to_excel("summary.xlsx", sheet_name="Summary", index=False)
index=False pandas को उसके रो नंबर (0, 1, 2…) अतिरिक्त कॉलम के रूप में लिखने से रोकता है। index=True सिर्फ़ तब रखें जब index का कोई मतलब हो — जैसे पिवट टेबल जिसमें Region index है।
एक ही फ़ाइल नाम पर to_excel दो बार चलाने से फ़ाइल ओवरराइट होती है — दूसरी शीट पहली की जगह ले लेती है। कई शीट के लिए ExcelWriter इस्तेमाल करें।
2. एक वर्कबुक में कई शीट
import pandas as pd
df = pd.read_excel("sales.xlsx", sheet_name="Data")
by_region = df.groupby("Region", as_index=False)["Amount"].sum()
by_person = df.groupby("Salesperson", as_index=False)["Amount"].sum()
with pd.ExcelWriter("report.xlsx", engine="openpyxl") as writer:
by_region.to_excel(writer, sheet_name="Summary", index=False)
by_person.to_excel(writer, sheet_name="By Salesperson", index=False)
df.to_excel(writer, sheet_name="Raw Data", index=False)
with ब्लॉक फ़ाइल एक बार खोलता है, हर शीट लिखता है, और ब्लॉक ख़त्म होने पर सेव करता है।
3. हर ग्रुप की एक शीट (Python वाला sheet splitter)
with pd.ExcelWriter("by_region.xlsx", engine="openpyxl") as writer:
for region, group in df.groupby("Region"):
group.to_excel(writer, sheet_name=str(region)[:31], index=False)
शीट के नाम: अधिकतम 31 अक्षर, और \ / ? * [ ] : नहीं हो सकते। [:31] लंबे नामों से बचाता है।
इसकी जगह हर ग्रुप की एक फ़ाइल:
for region, group in df.groupby("Region"):
group.to_excel(f"Sales_{region}.xlsx", index=False)
इसकी तुलना VBA प्रोजेक्ट मॉड्यूल के 60 लाइन वाले VBA splitter से करें।
4. मौजूदा फ़ाइल में शीट जोड़ें या बदलें
with pd.ExcelWriter("report.xlsx", engine="openpyxl", mode="a", if_sheet_exists="replace") as writer:
by_region.to_excel(writer, sheet_name="Summary", index=False)
mode="a"— मौजूदा वर्कबुक में जोड़ो (बाकी शीट बची रहती हैं)।if_sheet_exists="replace"— Summary शीट पहले से हो तो बदल दो। दूसरे विकल्प:"new"("Summary1" जोड़ता है),"overlay"(शीट साफ़ किए बिना सेल पर लिखता है),"error"(डिफ़ॉल्ट)।
ध्यान दें: शीट बदलने से उसकी फ़ॉर्मेटिंग और चार्ट हट जाते हैं। "सजी हुई" शीट को उन डेटा शीट से अलग रखें जिन्हें Python दोबारा लिखता है।
5. एक शीट पर कई टेबल
with pd.ExcelWriter("dashboard.xlsx", engine="openpyxl") as writer:
by_region.to_excel(writer, sheet_name="Report", startrow=2, index=False)
by_person.to_excel(writer, sheet_name="Report", startrow=2, startcol=4, index=False)
writer.sheets["Report"]["A1"] = "Monthly Sales Report"
startrow / startcol 0 से गिने जाते हैं (startrow=2 → टेबल रो 3 से शुरू)। writer.sheets[...] से openpyxl शीट मिलती है जिस पर शीर्षक या कुछ भी लिख सकते हैं।
6. तारीख़, नंबर और खाली वैल्यू
- तारीख़ें असली Excel तारीख़ के रूप में लिखी जाती हैं। दिखने का फ़ॉर्मेट openpyxl से सेट करें (अगला लेसन), या ExcelWriter में
date_format="DD-MM-YYYY"/datetime_format="DD-MM-YYYY"दें। NaNखाली सेल बनता है। डैश दिखाने के लिएto_excelमेंna_rep="-"दें।- PIN जैसे कोड pandas में टेक्स्ट (
astype(str)) रखें ताकि शुरुआती ज़ीरो बचे रहें।
7. खुली फ़ाइल पर न लिखें
Windows पर Excel में खुली फ़ाइल पर लिखने से PermissionError आता है। पहले बंद करें, या तारीख़ वाले नए नाम से लिखें:
from datetime import date
out = f"Sales_Report_{date.today():%Y-%m-%d}.xlsx"
आम गलतियाँ
ExcelWriter के बिना एक ही पाथ पर बार-बार to_excel (सिर्फ़ आख़िरी शीट बचती है)। लंबे या अमान्य शीट नाम। index=False भूलना। फ़ाइल Excel में खुली होने पर लिखना।