如何用Pandas的read_excel/to_excel不覆盖数据写入Excel?含新Sheet方案
嘿,我来帮你搞定这个Excel写入的问题!
首先得明确:Excel确实没有像to_csv("file.csv", "a")那样一键追加到同一张工作表的简单选项,但我们可以通过两种思路实现你的需求——要么追加数据到现有工作表的末尾,要么添加全新的工作表来存放新数据,下面给你详细说明:
方案1:追加数据到现有工作表末尾
这个思路需要先读取现有Excel里的目标工作表,找到数据的最后一行,再把新的DataFrame从该行开始写入,用openpyxl作为引擎就能实现:
import pandas as pd from openpyxl import load_workbook # 你的新数据DataFrame new_df = pd.DataFrame({'col1': [1,2,3], 'col2': [4,5,6]}) file_path = "model.xlsx" # 加载现有的Excel文件 book = load_workbook(file_path) # 初始化ExcelWriter,关键参数:mode='a'(追加)、if_sheet_exists='overlay'(覆盖指定工作表的内容,这里用来追加) writer = pd.ExcelWriter(file_path, engine='openpyxl', mode='a', if_sheet_exists='overlay') # 把加载的book赋值给writer,这步很容易忘! writer.book = book # 找到目标工作表的最后一行 target_sheet = 'Sheet1' # 替换成你要追加的工作表名称 if target_sheet in writer.sheets: ws = writer.sheets[target_sheet] start_row = ws.max_row else: # 如果工作表不存在,就从第0行开始写(相当于新建工作表并写入) start_row = 0 # 写入新数据,header=False是因为原有工作表已经有表头了,根据实际情况调整 new_df.to_excel(writer, sheet_name=target_sheet, startrow=start_row, header=False, index=False) # 保存并关闭 writer.close()
⚠️ 注意:if_sheet_exists='overlay'是Pandas 1.4.0及以上版本才支持的参数,如果你的Pandas版本太低,记得先升级(pip install --upgrade pandas)。
方案2:添加新工作表写入数据(不覆盖原有内容)
如果不需要追加到同一张表,而是新增工作表存放新数据,这个更简单,直接用mode='a'模式打开ExcelWriter,指定新的工作表名称即可:
import pandas as pd new_df = pd.DataFrame({'col1': [7,8,9], 'col2': [10,11,12]}) # 用mode='a'追加模式,指定新的工作表名称 with pd.ExcelWriter("model.xlsx", engine='openpyxl', mode='a') as writer: # 替换成你想要的工作表名称,注意不能和现有表重名,否则会报错 new_df.to_excel(writer, sheet_name='新数据_20240520', index=False)
如果担心工作表重名,可以先检查一下:
from openpyxl import load_workbook book = load_workbook("model.xlsx") new_sheet_name = '新数据_20240520' if new_sheet_name not in book.sheetnames: # 执行上面的写入操作 with pd.ExcelWriter("model.xlsx", engine='openpyxl', mode='a') as writer: new_df.to_excel(writer, sheet_name=new_sheet_name, index=False) else: print(f"工作表{new_sheet_name}已经存在啦!")
关于你说的openpyxl方案未生效的可能原因
你之前尝试的openpyxl方案没生效,大概率是这几个问题:
- 没加
mode='a'参数:默认是mode='w',会直接覆盖整个Excel文件 - 忘记把加载的
book赋值给writer.book:这会导致writer无法识别现有文件的内容 - Pandas版本太低,不支持
if_sheet_exists等关键参数 - 工作表名称写错了,或者目标工作表根本不存在
内容的提问来源于stack exchange,提问作者shenxiaoya
相关产品推荐
相关产品推荐

