วิธีบันทึกแผ่นงานใหม่ในไฟล์ excel ที่มีอยู่โดยใช้ Pandas


90

ฉันต้องการใช้ไฟล์ excel เพื่อจัดเก็บข้อมูลที่ซับซ้อนด้วย python ปัญหาของฉันคือฉันไม่สามารถเพิ่มชีตลงในไฟล์ excel ที่มีอยู่ได้ ที่นี่ฉันขอแนะนำให้ใช้โค้ดตัวอย่างเพื่อแก้ไขปัญหานี้

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()

รหัสนี้จะบันทึก DataFrames สองแผ่นลงในแผ่นงานสองแผ่นชื่อ "x1" และ "x2" ตามลำดับ หากฉันสร้าง DataFrames ใหม่สองรายการและพยายามใช้รหัสเดียวกันเพื่อเพิ่มแผ่นงานใหม่สองแผ่นคือ '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()

ฉันต้องการไฟล์ excel ที่มีสี่แผ่น: '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" และ "dict" คืออะไรในบริบทนี้

วิธีใดเป็นวิธีที่ดีที่สุดในการบันทึก "x1" และ "x2" จากนั้นปิดไฟล์เปิดอีกครั้งและเพิ่ม "x3" และ "x4"

คำตอบ:


121

ขอขอบคุณ. ฉันเชื่อว่าตัวอย่างที่สมบูรณ์อาจเป็นประโยชน์สำหรับคนอื่น ๆ ที่มีปัญหาเดียวกัน:

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()

ที่นี่ฉันสร้างไฟล์ excel จากความเข้าใจของฉันมันไม่สำคัญว่าจะสร้างผ่านเอ็นจิ้น "xslxwriter" หรือ "openpyxl"

เมื่อฉันต้องการเขียนโดยไม่สูญเสียข้อมูลต้นฉบับแล้ว

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: ไม่มีนักเขียน Excel 'Sales Leads Calculations.xlsx'
bernando_vialli

1
ใช่นี่คือการเพิ่มแผ่นงานลงใน excel โดยไม่ต้องเช็ดชีตที่มีอยู่แล้วออก ขอบคุณ!
Nikhil VJ

2
เมื่อบันทึกไฟล์ excel ฉันจะเก็บรูปแบบแผ่นงาน excel ที่มีอยู่ได้อย่างไร
Vineesh TP

3
หากใครอ่านสิ่งนี้และสงสัยว่าจะเขียนทับแผ่นงานที่มีอยู่ด้วยชื่อเดียวกันได้อย่างไรแทนที่จะเปลี่ยนชื่อใหม่ให้เพิ่มบรรทัด writer.sheets = dict((ws.title, ws) for ws in book.worksheets) หลัง writer.book = book
Harm te Molder

1
@Stefano Fedele คุณสามารถอัปเดต excel ที่มีอยู่เดิมโดยใช้ 'xlsxwriter' แทน 'openpyxl' ได้หรือไม่?
M Nikesh

15

ในตัวอย่างที่คุณแชร์คุณโหลดไฟล์ที่มีอยู่ลงbookและการตั้งค่าที่จะเป็นwriter.book bookในบรรทัดที่คุณกำลังเข้าถึงแผ่นในสมุดงานแต่ละwriter.sheets = dict((ws.title, ws) for ws in book.worksheets) wsจากนั้นชื่อแผ่นงานคือwsคุณกำลังสร้างพจนานุกรมของ{sheet_titles: sheet}คีย์คู่ค่า จากนั้นพจนานุกรมนี้จะถูกตั้งค่าเป็น writer.sheets โดยพื้นฐานแล้วขั้นตอนเหล่านี้เป็นเพียงการโหลดข้อมูลที่มีอยู่'Masterfile.xlsx'และเติมข้อมูลนักเขียนของคุณด้วย

สมมติว่าคุณมีไฟล์ที่มีx1และx2เป็นแผ่นงานอยู่แล้ว คุณสามารถใช้โค้ดตัวอย่างในการโหลดไฟล์แล้วสามารถทำอะไรเช่นนี้เพื่อเพิ่มและ x3x4

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: ไม่มีนักเขียน Excel 'Sales Leads Calculations.xlsx'
bernando_vialli

18
นี่คือการลบแผ่นงานที่มีอยู่แล้ว
Nikhil VJ

13

ตัวอย่างง่ายๆสำหรับการเขียนข้อมูลหลายรายการเพื่อ excel ในแต่ละครั้ง และเมื่อคุณต้องการผนวกข้อมูลลงในชีตในไฟล์ excel ที่เขียน (ไฟล์ excel แบบปิด)

เมื่อคุณเขียนลงใน excel เป็นครั้งแรก (การเขียน "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()    

หลังจากคุณปิด excel ของคุณ แต่คุณต้องการ "ต่อท้าย" ข้อมูลในไฟล์ excel เดียวกัน แต่ต้องการอีกแผ่นหนึ่งสมมติว่า "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()     

โปรดสังเกตว่ารูปแบบ excel ต้องไม่ใช่ xls คุณสามารถใช้ xlsx one ได้


1
ฉันไม่เห็นว่าคำตอบนี้เพิ่มอะไร ในความเป็นจริงการใช้ตัวจัดการบริบทซ้ำ ๆ เช่นนี้จะเกี่ยวข้องกับ I / O มากขึ้น
Charlie Clark

8

ฉันขอแนะนำให้คุณทำงานโดยตรงกับopenpyxl เนื่องจากตอนนี้รองรับ Pandas DataFramesแล้ว

สิ่งนี้ช่วยให้คุณสามารถจดจ่อกับรหัส Excel และ Pandas ที่เกี่ยวข้องได้


3
มันจะมีประโยชน์มากถ้าคุณสามารถเพิ่มตัวอย่าง "นุ่น" ที่คล้ายกันนี้ได้อีก
นิด

ฉันไม่ได้ทำงานกับ Pandas ด้วยตัวเองมากนักดังนั้นฉันจึงไม่สามารถให้ตัวอย่างได้มากนัก แต่ยินดีที่จะปรับปรุงเอกสารประกอบ
Charlie Clark

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หรือคุณไม่จำเป็นต้องทำ?
MattSom

คุณสามารถทำได้ด้วย Excelwriter แต่ฉันพบว่ามันง่ายกว่าด้วยการใช้ openpyxl
Jis Mathew

2

คุณสามารถอ่านแผ่นงานที่คุณสนใจที่มีอยู่เช่น 'x1', 'x2' ลงในหน่วยความจำและ 'เขียน' กลับก่อนที่จะเพิ่มแผ่นงานใหม่เพิ่มเติม (โปรดทราบว่าแผ่นงานในไฟล์และแผ่นงานในหน่วยความจำนั้นแตกต่างกันสองอย่าง สิ่งต่างๆหากคุณไม่อ่านมันจะสูญหายไป) วิธีนี้ใช้ 'xlsxwriter' เท่านั้นไม่มี openpyxl เกี่ยวข้อง

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()

หากคุณต้องการเก็บแผ่นงานที่มีอยู่ทั้งหมดคุณสามารถแทนที่โค้ดด้านบนระหว่าง start และ end ด้วย

# 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')

2
ฉันไม่ได้ติดตามว่าสิ่งนี้เกี่ยวข้องกับคำถามอย่างไรยกเว้นว่าเกี่ยวกับ excel
Artog

ฉันกำลังหาวิธีแก้ปัญหาที่สมบูรณ์ในการอ่านและเขียนลงในสมุดงานที่มีอยู่ แต่ไม่พบสิ่งเดียวกัน ที่นี่ฉันพบคำแนะนำเกี่ยวกับวิธีการเขียนลงในสมุดงานที่มีอยู่ดังนั้นฉันจึงคิดหาวิธีแก้ปัญหาที่สมบูรณ์สำหรับปัญหาของฉัน หวังว่าจะชัดเจน
nileshk611

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 ด้านบนคุณต้องโหลดแล้วจึงเขียนใหม่เพื่อต่อท้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.