पंडों का उपयोग करके मौजूदा एक्सेल फ़ाइल में एक नई शीट कैसे बचाएं?


86

मैं अजगर के साथ विस्तृत डेटा संग्रहीत करने के लिए एक्सेल फ़ाइलों का उपयोग करना चाहता हूं। मेरी समस्या यह है कि मैं मौजूदा एक्सेल फाइल में शीट नहीं जोड़ सकता। यहाँ मैं इस मुद्दे तक पहुँचने के लिए काम करने के लिए एक नमूना कोड सुझाता हूँ

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

यह कोड दो डेटाफ़्रेम को दो शीट में क्रमशः "X1" और "x2" नाम से सहेजता है। यदि मैं दो नए डेटाफ़्रेम बनाता हूं और दो नई शीट, 'x3' और 'x4' को जोड़ने के लिए समान कोड का उपयोग करने का प्रयास करता हूं, तो मूल डेटा खो जाता है।

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

मुझे चार शीट वाली एक्सेल फाइल चाहिए: 'X1', 'x2', 'x3', 'x4'। मुझे पता है कि 'xlsxwriter' केवल "इंजन" नहीं है, 'Openpyxl' है। मैंने यह भी देखा कि पहले से ही अन्य लोग हैं जिन्होंने इस मुद्दे के बारे में लिखा है, लेकिन फिर भी मैं यह नहीं समझ सकता कि ऐसा कैसे करें।

यहाँ इस लिंक से एक कोड लिया गया है

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()

वे कहते हैं कि यह काम करता है, लेकिन यह पता लगाना मुश्किल है कि कैसे। मुझे समझ नहीं आ रहा है कि इस संदर्भ में "ws.title", "ws" और "तानाशाह" क्या हैं।

"एक्स 1" और "एक्स 2" को बचाने का सबसे अच्छा तरीका क्या है, फिर फ़ाइल को बंद करें, इसे फिर से खोलें और "x3" और "x4" जोड़ें?

जवाबों:


117

धन्यवाद। मेरा मानना ​​है कि एक पूर्ण उदाहरण किसी और के लिए अच्छा हो सकता है जिनके पास एक ही मुद्दा है:

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()

यहाँ मैं एक एक्सेल फ़ाइल उत्पन्न करता हूं, मेरी समझ से यह वास्तव में कोई फर्क नहीं पड़ता कि यह "xslxwriter" या "ओपनपीएक्सएक्सएल" इंजन के माध्यम से उत्पन्न होता है या नहीं।

जब मैं मूल डेटा को खोए बिना लिखना चाहता हूं तब

import pandas as pd
import numpy as np
from openpyxl import load_workbook

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

book = load_workbook(path)
writer = pd.ExcelWriter(path, engine = 'openpyxl')
writer.book = book

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()

यह कोड काम करता है!


किसी भी विचार, जब मैं यह कोशिश करता हूं तो मुझे यह मिलता है: ValueError: कोई एक्सेल लेखक 'सेल्स लीड्स कैलकुलेशन.xlsx' नहीं?
bernando_vialli

1
हां, यह पहले से मौजूद चादरों को मिटाए बिना शीट को एक्सेल में जोड़ रहा है। धन्यवाद!
निखिल वीजे

2
एक्सेल फ़ाइल को सहेजते समय, मैं मौजूदा एक्सेल शीट प्रारूपों को कैसे रखूँ?
विनेश टीपी

3
अगर कोई इसे पढ़ता है और आश्चर्यचकित होता है कि नया नाम बदलने के बजाय एक ही नाम के साथ एक मौजूदा शीट को कैसे अधिलेखित किया जाए: इसके writer.sheets = dict((ws.title, ws) for ws in book.worksheets) बाद लाइन जोड़ें writer.book = book
हरम ते मोलर्ड

1
@Stefano Fedele क्या आप 'openpyxl' के बजाय 'xlsxwriter' का उपयोग करके मौजूदा एक्सेल के समान अपडेशन कर सकते हैं?
एम निकेश

15

आपके द्वारा साझा किए गए उदाहरण में आप मौजूदा फ़ाइल को लोड कर रहे हैं bookऔर होने का writer.bookमान सेट कर रहे हैं book। लाइन में writer.sheets = dict((ws.title, ws) for ws in book.worksheets)आप वर्कबुक में प्रत्येक शीट को एक्सेस कर रहे हैं ws। शीट शीर्षक wsतो आप {sheet_titles: sheet}कुंजी, मूल्य जोड़े का एक शब्दकोश बना रहे हैं । यह शब्दकोश तब author.sheets पर सेट किया गया है। अनिवार्य रूप से ये कदम सिर्फ मौजूदा डेटा को लोड कर रहे हैं 'Masterfile.xlsx'और आपके लेखक को उनके साथ जोड़ रहे हैं।

अब मान लें कि आपके पास पहले से ही एक फाइल है x1और x2चादर के रूप में। आप फ़ाइल को लोड करने के लिए उदाहरण कोड का उपयोग कर सकते हैं और फिर कुछ ऐसा जोड़ सकते हैं x3और जोड़ सकते हैं x4

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"
writer = pd.ExcelWriter(path, engine='openpyxl')
df3.to_excel(writer, 'x3', index=False)
df4.to_excel(writer, 'x4', index=False)
writer.save()

वही करना चाहिए जो आप ढूंढ रहे हैं।


किसी भी विचार, जब मैं यह कोशिश करता हूं तो मुझे यह मिलता है: ValueError: कोई एक्सेल लेखक 'सेल्स लीड्स कैलकुलेशन.xlsx' नहीं?
bernando_vialli

18
यह पहले से मौजूद चादरों को मिटा रहा है।
निखिल वीजे

13

एक बार में कई डेटा लिखने के लिए एक सरल उदाहरण। और यह भी कि जब आप किसी लिखित एक्सेल फाइल (क्लोज्ड एक्सेल फाइल) पर एक शीट पर डेटा को जोड़ना चाहते हैं।

जब यह पहली बार किसी एक्सेल में लिख रहा हो। ("Df1" और "df2" को "1st_sheet" और "2nd_sheet" लिखना)

import pandas as pd 
from openpyxl import load_workbook

df1 = pd.DataFrame([[1],[1]], columns=['a'])
df2 = pd.DataFrame([[2],[2]], columns=['b'])
df3 = pd.DataFrame([[3],[3]], columns=['c'])

excel_dir = "my/excel/dir"

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, '1st_sheet')   
    df2.to_excel(writer, '2nd_sheet')   
    writer.save()    

आपके द्वारा अपना एक्सेल बंद करने के बाद, लेकिन आप उसी एक्सेल फाइल पर "अपेंड" डेटा डालना चाहते हैं, लेकिन दूसरी शीट पर "df3" को शीट नाम "3rd_sheet" कहें।

book = load_workbook(excel_dir)
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer:
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)    

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet')  

    writer.save()     

ध्यान रखें कि एक्सेल प्रारूप xls नहीं होना चाहिए, आप xlsx एक का उपयोग कर सकते हैं।


1
मुझे नहीं लगता कि यह उत्तर क्या कहता है। वास्तव में, इस तरह से एक संदर्भ प्रबंधक के बार-बार उपयोग में बहुत अधिक I / O शामिल होंगे।
चार्ली क्लार्क

8

मैं दृढ़ता से आपको सीधे Openpyxl के साथ काम करने की सलाह दूंगा क्योंकि यह अब पंडास डाटाफ्रेम का समर्थन करता है

यह आपको संबंधित एक्सेल और पंडों कोड पर ध्यान केंद्रित करने की अनुमति देता है।


3
अगर आप थोड़ा और अधिक "पांडा" के समान उदाहरण जोड़ सकता है यह वास्तव में मददगार होगा इस
MaxU

मैं खुद पंडों के साथ बहुत काम नहीं करता हूं इसलिए मैं वास्तव में कई उदाहरण प्रदान नहीं कर सकता लेकिन प्रलेखन में सुधार का स्वागत करेगा।
चार्ली क्लार्क

4

एक नई फ़ाइल बनाने के लिए

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)
with pd.ExcelWriter('sample.xlsx') as writer:  
    df1.to_excel(writer, sheet_name='x1')

फाइल करने के लिए जोड़कर के लिए, तर्क का उपयोग mode='a'में pd.ExcelWriter

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)
with pd.ExcelWriter('sample.xlsx', engine='openpyxl', mode='a') as writer:  
    df2.to_excel(writer, sheet_name='x2')

डिफ़ॉल्ट है mode ='w'प्रलेखन देखें ।


3

ExcelWriter का उपयोग किए बिना कर सकते हैं, Openpyxl में टूल का उपयोग कर सकते हैं। इससे नई शीट में फोंट को जोड़ना आसान हो सकता है openpyxl.styles

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

#Location of original excel sheet
fileLocation =r'C:\workspace\data.xlsx'

#Location of new file which can be the same as original file
writeLocation=r'C:\workspace\dataNew.xlsx'

data = {'Name':['Tom','Paul','Jeremy'],'Age':[32,43,34],'Salary':[20000,34000,32000]}

#The dataframe you want to add
df = pd.DataFrame(data)

#Load existing sheet as it is
book = load_workbook(fileLocation)
#create a new sheet
sheet = book.create_sheet("Sheet Name")

#Load dataframe into new sheet
for row in dataframe_to_rows(df, index=False, header=True):
    sheet.append(row)

#Save the modified excel at desired location    
book.save(writeLocation)

यह एक अच्छा समाधान है, हालांकि मुझे यकीन नहीं है कि यह एक निहितार्थ भी है। क्या आपका मतलब है कि आप ऐसा नहीं कर सकते हैं ExcelWriterया आपको इसकी आवश्यकता नहीं है?
मैटसोम

आप इसे एक्सेलराइटर के साथ कर सकते हैं, लेकिन मुझे ओपनपीक्सएल का उपयोग करने में आसानी होती है।
जीस मैथ्यू

2

आप अपनी रुचियों की मौजूदा शीट पढ़ सकते हैं, उदाहरण के लिए, 'X1', 'x2', मेमोरी में और अधिक नई शीट्स जोड़ने से पहले उन्हें 'राइट' करें (ध्यान रखें कि एक फाइल में शीट और मेमोरी में शीट दो अलग हैं चीजें, यदि आप उन्हें नहीं पढ़ते हैं, तो वे खो जाएंगे)। यह दृष्टिकोण केवल 'xlsxwriter' का उपयोग करता है, इसमें कोई भी ओपनपीएक्सएल शामिल नहीं है।

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

# begin <== read selected sheets and write them back
df1 = pd.read_excel(path, sheet_name='x1', index_col=0) # or sheet_name=0
df2 = pd.read_excel(path, sheet_name='x2', index_col=0) # or sheet_name=1
writer = pd.ExcelWriter(path, engine='xlsxwriter')
df1.to_excel(writer, sheet_name='x1')
df2.to_excel(writer, sheet_name='x2')
# end ==>

# now create more new sheets
x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name='x3')
df4.to_excel(writer, sheet_name='x4')
writer.save()
writer.close()

यदि आप सभी मौजूदा चादरों को संरक्षित करना चाहते हैं, तो आप शुरू और अंत के बीच उपरोक्त कोड को बदल सकते हैं:

# read all existing sheets and write them back
writer = pd.ExcelWriter(path, engine='xlsxwriter')
xlsx = pd.ExcelFile(path)
for sheet in xlsx.sheet_names:
    df = xlsx.parse(sheet_name=sheet, index_col=0)
    df.to_excel(writer, sheet_name=sheet)

1
#This program is to read from excel workbook to fetch only the URL domain names and write to the existing excel workbook in a different sheet..
#Developer - Nilesh K
import pandas as pd
from openpyxl import load_workbook #for writting to the existing workbook

df = pd.read_excel("urlsearch_test.xlsx")

#You can use the below for the relative path.
# r"C:\Users\xyz\Desktop\Python\

l = [] #To make a list in for loop

#begin
#loop starts here for fetching http from a string and iterate thru the entire sheet. You can have your own logic here.
for index, row in df.iterrows():
    try: 
        str = (row['TEXT']) #string to read and iterate
        y = (index)
        str_pos = str.index('http') #fetched the index position for http
        str_pos1 = str.index('/', str.index('/')+2) #fetched the second 3rd position of / starting from http
        str_op = str[str_pos:str_pos1] #Substring the domain name
        l.append(str_op) #append the list with domain names

    #Error handling to skip the error rows and continue.
    except ValueError:
            print('Error!')
print(l)
l = list(dict.fromkeys(l)) #Keep distinct values, you can comment this line to get all the values
df1 = pd.DataFrame(l,columns=['URL']) #Create dataframe using the list
#end

#Write using openpyxl so it can be written to same workbook
book = load_workbook('urlsearch_test.xlsx')
writer = pd.ExcelWriter('urlsearch_test.xlsx',engine = 'openpyxl')
writer.book = book
df1.to_excel(writer,sheet_name = 'Sheet3')
writer.save()
writer.close()

#The below can be used to write to a different workbook without using openpyxl
#df1.to_excel(r"C:\Users\xyz\Desktop\Python\urlsearch1_test.xlsx",index='false',sheet_name='sheet1')

1
मैं इस सवाल से संबंधित नहीं है कि इसका अनुसरण कैसे कर रहा हूँ, सिवाय इसके कि एक्सेल के बारे में।
आर्टोग

मैं मौजूदा कार्यपुस्तिका को पढ़ने और लिखने के लिए एक पूर्ण समाधान खोजने के लिए काम कर रहा था, लेकिन इसे खोजने में असमर्थ था। यहाँ मुझे एक संकेत मिला कि मौजूदा कार्यपुस्तिका को कैसे लिखा जाए इसलिए मैंने अपनी समस्या का पूरा हल देने के बारे में सोचा। आशा है कि यह स्पष्ट है।
nileshk611 17

0

इसके बारे में जाने के लिए एक और काफी सरल तरीका इस तरह से एक विधि बनाना है:

def _write_frame_to_new_sheet(path_to_file=None, sheet_name='sheet', data_frame=None):
    book = None
    try:
        book = load_workbook(path_to_file)
    except Exception:
        logging.debug('Creating new workbook at %s', path_to_file)
    with pd.ExcelWriter(path_to_file, engine='openpyxl') as writer:
        if book is not None:
            writer.book = book
        data_frame.to_excel(writer, sheet_name, index=False)

यहां विचार कार्यपुस्तिका को path_to_file पर लोड करने के लिए है यदि यह मौजूद है और फिर data_frame को sheet_name के साथ एक नई शीट के रूप में जोड़ देता है । यदि कार्यपुस्तिका मौजूद नहीं है, तो इसे बनाया गया है। ऐसा लगता है कि न तो Openpyxl या xlsxwriter एपेंड, इसलिए @Stefano द्वारा उदाहरण में, आपको वास्तव में लोड करना होगा और फिर एपेंड करना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.