如何解决Pandas将两个DataFrame写入已有Excel文件时Sheet1已存在的错误并保留原有工作表?
解决Pandas追加写入Excel时Sheet已存在的问题
这个问题的核心是openpyxl在追加模式下默认不允许覆盖已存在的工作表,而xlsxwriter确实只支持创建新文件(会覆盖原有内容),所以我们可以用openpyxl的if_sheet_exists参数或者手动删除旧工作表来解决。
方案1:直接替换已存在的Sheet1(推荐)
如果你的需求是用新数据完全替换掉原有的Sheet1,只需要在初始化ExcelWriter时添加if_sheet_exists='replace'参数即可,这个参数会自动替换掉已存在的同名工作表:
import pandas as pd # 读取源数据 df = pd.read_excel("Data Set Finished.xlsx", sheet_name="Details") df2 = df.sum(axis=1) # 初始化Writer,指定替换已存在的Sheet1 writer = pd.ExcelWriter( "Data Set Finished.xlsx", engine="openpyxl", mode="a", if_sheet_exists="replace" ) # 写入主DataFrame到Sheet1(从A1开始) df.to_excel(writer, sheet_name="Sheet1", index=False) # 写入求和结果到Sheet1的第2行第13列(startrow/startcol从0开始计数) df2.to_excel(writer, sheet_name="Sheet1", startrow=1, startcol=12, index=False, header=False) # 务必保存并关闭Writer writer.close()
注意:if_sheet_exists参数是Pandas 1.4.0及以上版本才支持的,如果你用的是旧版本Pandas,需要先升级(pip install --upgrade pandas),或者用下面的方案。
方案2:先删除旧Sheet1再创建新的
如果你担心替换操作会有意外,或者用的是低版本Pandas,可以先手动加载Excel文件,删除已存在的Sheet1,再执行写入操作:
import pandas as pd from openpyxl import load_workbook # 第一步:加载现有工作簿并删除Sheet1(如果存在) wb = load_workbook("Data Set Finished.xlsx") if "Sheet1" in wb.sheetnames: wb.remove(wb["Sheet1"]) wb.save("Data Set Finished.xlsx") # 第二步:读取数据并写入新的Sheet1 df = pd.read_excel("Data Set Finished.xlsx", sheet_name="Details") df2 = df.sum(axis=1) writer = pd.ExcelWriter("Data Set Finished.xlsx", engine="openpyxl", mode="a") df.to_excel(writer, sheet_name="Sheet1", index=False) df2.to_excel(writer, sheet_name="Sheet1", startrow=1, startcol=12, index=False, header=False) writer.close()
小提示
你的df2是一个Series,如果你想给它添加列名(比如"行总计"),可以把它转成DataFrame:
df2 = pd.DataFrame(df.sum(axis=1), columns=["行总计"])
这样写入时如果去掉header=False,就能保留列名啦。
内容的提问来源于stack exchange,提问作者sendhelppls




