如何在现有Excel工作簿的同一工作表中多次写入不同DataFrame
已有Excel工作簿同工作表多次写入DataFrame解决方案
问题原因
你遇到的覆盖/自动新建工作表问题,是因为每次写入DataFrame时都重新初始化了ExcelWriter实例,触发了工作表存在校验逻辑。只需要在同一个ExcelWriter实例的生命周期内完成所有写入操作,即可解决该问题,同时不会修改原有Sheet1、Sheet2、Sheet3的内容。
前置依赖
需要安装openpyxl作为Excel读写引擎:
pip install openpyxl pandas>=1.4.0
(if_sheet_exists='overlay'参数要求pandas版本≥1.4.0)
代码实现
固定数量DataFrame写入
import pandas as pd # 替换为你的本地Excel文件路径 excel_path = "你的工作簿.xlsx" # 仅初始化一次ExcelWriter,使用追加模式 with pd.ExcelWriter( excel_path, engine="openpyxl", mode="a", if_sheet_exists="overlay" ) as writer: # 写入第一个DataFrame,从第0行开始 df1.to_excel(writer, sheet_name="NewSheet", index=False) # 写入第二个DataFrame,从第10行开始 df2.to_excel(writer, sheet_name="NewSheet", startrow=10, index=False)
多DataFrame循环批量写入
import pandas as pd excel_path = "你的工作簿.xlsx" # 替换为你要写入的DataFrame列表 df_list = [df1, df2, df3] # 记录当前写入的起始行号,初始为0 current_start_row = 0 with pd.ExcelWriter( excel_path, engine="openpyxl", mode="a", if_sheet_exists="overlay" ) as writer: for df in df_list: df.to_excel( writer, sheet_name="NewSheet", startrow=current_start_row, index=False ) # 计算下一个DataFrame的起始行,+2是为了两个表格之间空2行分隔 current_start_row += len(df) + 2
低版本pandas兼容方案
如果无法升级pandas到1.4.0及以上版本,可先读取NewSheet的已有内容,和待写入的所有DataFrame拼接后一次性写入:
import pandas as pd from openpyxl import load_workbook excel_path = "你的工作簿.xlsx" df_list = [df1, df2, df3] # 读取原有工作簿 book = load_workbook(excel_path) # 如果NewSheet不存在就新建,存在就获取该工作表 if "NewSheet" not in book.sheetnames: book.create_sheet("NewSheet") writer = pd.ExcelWriter(excel_path, engine="openpyxl") writer.book = book writer.sheets = {ws.title: ws for ws in book.worksheets} current_start_row = 0 for df in df_list: df.to_excel(writer, sheet_name="NewSheet", startrow=current_start_row, index=False) current_start_row += len(df) + 2 writer.save() writer.close()
内容的提问来源于stack exchange,提问作者Gingerhaze
相关产品推荐
相关产品推荐

