Pandas写入Excel表格时删除文件中的其他工作表。

6
我有一段简单的代码,可以将Python数据框导出到已存在的Excel文件中的工作表。但是写入器会删除文件中现有的工作表。
read = pd.ExcelFile('Saw_Load.xlsx')
print(read.sheet_names)
writer = pd.ExcelWriter('Saw_Load.xlsx')
result.to_excel(writer,'saw', index = False)
read2 = pd.ExcelFile('Saw_Load.xlsx')
print(read2.sheet_names)
writer.save()

这是我得到的输出结果

['saw', 'Pivot']
['saw']

我们可以清楚地看到,在使用to_excel函数之前,有两个工作表(saw,Pivot)。使用后,只剩下一个“saw”。这可能是公式中的简单修复问题,但似乎找不到任何能起作用的方法。任何帮助将不胜感激。谢谢。

可能是[如何使用pandas向现有的Excel文件中写入数据而不覆盖原有数据?](https://dev59.com/5WIj5IYBdhLWcg3wfVB8)的重复问题。 - BruceWayne
@BruceWayne 谢谢,我尝试了那个表格中的解决方案,它有效了,但似乎会破坏文件并移除其他选项卡中的一些特殊格式。例如,当添加切片器时,它可以与数据透视表一起使用,但会损坏文件。 - Shri
4个回答

10

你的问题在于没有重新写入包含在该书中的旧sheets。假设你需要从头开始重新写入,但不要再次执行to_excel,而只需指定工作簿。

这是因为xlsxwriter创建了一个新文件,因此旧文件被删除了。

您可以通过使用writer.bookwriter.sheets对象来完成。

excelBook = load_workbook(filename)
with pd.ExcelWriter(filename, engine='xlsxwriter') as writer:
    # Save your file workbook as base
    writer.book = excelBook
    writer.sheets = dict((ws.title, ws) for ws in excelBook.worksheets)

    # Now here add your new sheets
    result.to_excel(writer,'saw', index = False)

    # Save the file
    writer.save()

注意:请注意我使用了来自openpyxlload_workbook,但是你可以不使用它,仅进行微小更改并使用Excelfile重现。


我遇到了与OP相同的问题。我采用了你的代码,但是出现了以下错误:*AttributeError: 'Workbook' object has no attribute 'add_format'*。我正在写入一个测试xlsx工作簿,其中包括我正在写入的一个选项卡和其他两个选项卡。没有添加任何其他格式。谢谢。 - SModi
我认为您在所选引擎方面遇到了问题。请检查此其他问题:https://dev59.com/cbjoa4cB1Zd3GeqPDLaa - Btc Sources
没错。我改用了openpyxl,按照这里的解决方案成功了:https://dev59.com/VVkT5IYBdhLWcg3wG7_4。谢谢。 - SModi

3

试试这个:

with pd.ExcelWriter('Saw_load.xlsx', engine="openpyxl", mode="a") as writer:
    result.to_excel(writer, sheet_name="name_of_sheet")

希望这能帮到你!

1
我还没有成功让它智能地添加数据。使用写入模式 'a',即使已经存在一个Sheet1工作表,我也会得到一个额外的工作表。使用写入模式 'w',则会删除以前的任何信息。 - illan

0

您可以使用if_sheet_exists参数,其值可以是replace或overlay。

with pd.ExcelWriter('file.xlsx', engine="openpyxl", mode="a" if_sheet_exists="overlay") as writer:
    df.to_excel(writer, sheet_name="name_of_sheet")

1
我相信应该是 "if_sheet_exists",而不是 "if_sheets_exists"。 - Hùng Nguyễn
1
我相信应该是 "if_sheet_exists",而不是 "if_sheets_exists"。 - undefined

-2

试试这个(虽然我不确定result是从哪里来的):

read = pd.ExcelFile('Saw_Load.xlsx')
print(read.sheet_names)
_writer = pd.ExcelWriter('Saw_Load.xlsx')
result.to_excel(_writer,'saw', index = False)

从这里开始的想法:

如果传递一个现有的ExcelWriter对象,则该工作簿将添加该工作表。


1
抱歉,我忘记添加写入命令了。我的原始文件中有写入命令。但是输出结果仍然相同。 - Shri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接