fx Python for Excel
ENहिन्दी

कई शीट के साथ to_excel और ExcelWriter

⏱ 15 min

आप क्या सीखेंगे

  • एक DataFrame, एक फ़ाइल
  • एक वर्कबुक में कई शीट
  • हर ग्रुप की एक शीट (Python वाला sheet splitter)

समझिए

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 में खुली होने पर लिखना।

अभ्यास

mediumअपने सेल्स डेटा से Summary, By Salesperson, Raw Data और हर Region की एक शीट वाली report.xlsx बनाएँ। फिर दूसरी स्क्रिप्ट चलाएँ जो सिर्फ़ Summary शीट को टोटल के हिसाब से सॉर्ट किए रूप से बदल दे।
एक ExcelWriter में Summary, By Salesperson, Raw Data और चार region sheets North, South, East, West को index=False से लिखें। फिर mode="a", engine="openpyxl", if_sheet_exists="replace" में केवल Summary बदलें। Raw Data तथा region rows पहले जैसी रहें।

प्रश्नोत्तरी

एक फ़ाइल में 3 शीट कैसे लिखें?
with-block के साथ pd.ExcelWriter
शीट नाम की अधिकतम लंबाई?
31 अक्षर
मौजूदा फ़ाइल में शीट जोड़ने और होने पर बदलने के विकल्प?
mode="a", if_sheet_exists="replace"
कई शीट के साथ to_excel और ExcelWriter · हिंदी | ExcelWalaa