即使使用追加模式,使用 Excelwriter 将 DataFrame 写入新工作表也会删除所有其他工作表

Posted

技术标签:

【中文标题】即使使用追加模式,使用 Excelwriter 将 DataFrame 写入新工作表也会删除所有其他工作表【英文标题】:Using Excelwriter to write a DataFrame to a new sheet deletes all other sheets even when using append mode 【发布时间】:2021-01-28 01:26:39 【问题描述】:

我有一个要附加到的 .xlsx 文件。我正在使用:

excel_writer = pd.ExcelWriter('asdf.xlsx', engine='openpyxl', mode='a')
df.to_excel(excel_writer, sheet_name='dummy', index=False)
excel_writer.close()

确实成功创建了工作表“虚拟”,但删除了“asdf.xlsx”中的所有其他现有工作表。我正在使用附加模式,所以我不太确定还要检查哪里。 运行 Pandas 0.20.1 版

我尝试了docs for 0.20.1 中的代码,但它也覆盖了所有内容。

如果传递一个现有的 ExcelWriter 对象,那么工作表将是 添加到现有工作簿。这可以用来保存不同的 DataFrames 到一个工作簿:

writer = pd.ExcelWriter('output.xlsx')
df1.to_excel(writer,'Sheet1')
df2.to_excel(writer,'Sheet2')
writer.save()

【问题讨论】:

【参考方案1】:

问题是,您误解了附加功能。这意味着,您追加到当前的 excelwriter,但如果您未设置任何模式,则会创建一个新的空 excel 文件。您必须将 ExcelWriter 的模式设置为a(附加)。这将在您每次运行时附加新工作表:

import pandas as pd
from openpyxl import load_workbook

data = [
    "a": 1, "b": 2
]

df = pd.DataFrame(data)
df2 = pd.DataFrame(data)

book = load_workbook("output.xlsx")
writer = pd.ExcelWriter('output.xlsx', mode="a")

if "Sheet11" not in book.sheetnames:
    df.to_excel(writer, 'Sheet11')

if "Sheet21" not in book.sheetnames:
    df2.to_excel(writer, 'Sheet21')
    writer.save()

print(book.sheetnames)

编辑: 已添加load_workbook 这个答案的一部分是基于this answer

【讨论】:

那么有没有办法用你想要的“输出”文件中已有的任何数据填充 ExcelWriter?这样当你追加时,你真的是在追加而不是覆盖?我认为你上面的内容不会那样做 以上这些行将始终附加数据,如果工作表已经存在,它将附加一个其他名称。如果你想从 excel 文件中读取数据,你应该看看pd.read_excel 因此,如果不先将整个 excel 文件提取到数据帧 a、b、c 中,然后再将工作表“d”粘贴到由工作表 [a、b、c] 组成的 excel 文件,就没有干净的方法一起写 a,b,c,d 会有效地覆盖整个文件? 我编辑了我的分析器并添加了一个附加链接,这应该可以在不加载数据框中的所有数据的情况下完成您的工作。有关更多示例,请点击链接

以上是关于即使使用追加模式,使用 Excelwriter 将 DataFrame 写入新工作表也会删除所有其他工作表的主要内容,如果未能解决你的问题,请参考以下文章

即使 Web 浏览器控制台中没有错误,d3 js 饼图也没有显示。和 SVG 正在追加

使用 excelwriter 写入 Excel 文件不提供文件

使用 Pandas/ExcelWriter 为单元格中的文本部分着色

使用 Pandas Excelwriter 写入 StringIO 对象?

如何在 pd.ExcelWriter 中使用 xlsxwrite 引擎在底部的 python 中编写新行?

Pandas ExcelWriter Openpyxl 正在创建一个必须恢复的损坏文件