使用Pandas将工作表添加到现有的Excel文件中

4 python excel pandas

# Set the working folder to the same folder as the script
os.chdir(os.path.dirname(os.path.abspath(__file__)))

test = send_request().content
df = pd.read_csv(io.StringIO(test.decode('utf-8')))
writer = pd.ExcelWriter('NHL_STATS_JSB_final.xlsx', \
                        engine = 'xlsxwriter')
df.to_excel(writer, 'Player statistics', index=False)
writer.save()
Run Code Online (Sandbox Code Playgroud)

我不明白为什么,但是我正在尝试将工作表添加Player statistics到当前NHL_STATS_JSB_final.xlsx文件中,但是无法正常工作。我的代码没有将工作表添加到文件中,而是使用当前文件并擦除所有先前的工作表以添加新的工作表。

如何Player statistics删除所有其他工作表添加到当前的Excel文件中?

Bra*_*ell 7

这是我的一个项目的代码片段。这应该正是您想要的。您需要使用openpyxl而不是xlsxwriter来更新现有文件。

writer = pd.ExcelWriter(file_name, engine='openpyxl')

if os.path.exists(file_name):
    book = openpyxl.load_workbook(file_name)
    writer.book = book

df.to_excel(writer, sheet_name=key)
writer.save()
writer.close()
Run Code Online (Sandbox Code Playgroud)


pat*_*ng1 5

正如OP提到的,xlsxwriter将覆盖您现有的工作簿。Xlsxwriter 用于编写原始 .xlsx 文件。另一方面,Openpyxl 可以修改现有的 .xlsx 文件。

@Brad Campbell 使用 openpyxl 的回答是最好的方法。由于OP使用的是xlsxwriter引擎,我想演示可以读取现有的.xlsx文件,然后创建一个新的工作簿(同名),其中包含原始工作表和您创建的新工作表中的数据。想补充一下。

import pandas as pd
import os

xl = pd.ExcelFile('NHL_STATS_JSB_final.xlsx')
sheet_names = xl.sheet_names  # a list of existing sheet names

#the next three lines are OPs original code 
os.chdir(os.path.dirname(os.path.abspath(__file__)))

test = send_request().content
df = pd.read_csv(io.StringIO(test.decode('utf-8')))

#beginning the process of creating new workbook with the same name
writer = pd.ExcelWriter('NHL_STATS_JSB_final.xlsx', engine = 'xlsxwriter')

d = {} #creating an empty dictionary 
for i in range (0, len(sheet_names)):
    current_sheet_name = sheet_names[i]
    d[current_sheet_name] = pd.read_excel('NHL_STATS_JSB_final.xlsx', sheetname = i)
    d[current_sheet_name].to_excel(writer, '%s' % (current_sheet_name), index=False)

# adding in the new worksheet
df.to_excel(writer, 'Player statistics', index=False)
writer.save()
Run Code Online (Sandbox Code Playgroud)