如何使用ExcelWriter重新打开文件且不覆盖原有数据?
解决pandas ExcelWriter追加数据不覆盖的问题
你遇到的问题核心是:使用if_sheet_exists="overlay"时,df.to_excel()默认从第一行开始写入,直接覆盖了原有内容。下面是两种实用的解决办法:
方法一:合并新旧数据后写入
这种方式简单直接,适合数据量不大的场景:
- 尝试读取已有的Excel数据(文件不存在则直接用新数据)
- 合并新旧数据
- 重新写入完整数据
代码示例:
import pandas as pd # 假设每次循环生成的新数据是df try: # 读取已有数据 existing_df = pd.read_excel("schoolsheet.xlsx") # 合并数据,忽略索引避免重复 combined_df = pd.concat([existing_df, df], ignore_index=True) except FileNotFoundError: # 文件不存在时直接用新数据 combined_df = df # 写入文件,index=False避免生成额外索引列 combined_df.to_excel("schoolsheet.xlsx", index=False)
方法二:定位到最后一行追加
这种方式无需读取整个文件,效率更高,适合大数据场景:
- 用
mode="a"打开文件保留原有工作表 - 获取现有数据的最后一行行号
- 从该行开始写入新数据,避免重复写表头
代码示例:
import pandas as pd with pd.ExcelWriter("schoolsheet.xlsx", mode="a", if_sheet_exists="overlay") as writer: # 获取目标工作表(默认是Sheet1,根据实际表名修改) worksheet = writer.sheets['Sheet1'] # 拿到现有数据的最后一行行号 startrow = worksheet.max_row # 写入新数据:startrow指定起始行,header=False不重复写表头,index=False不生成索引 df.to_excel(writer, startrow=startrow, header=False, index=False)
注意事项
- 第一次写入文件时,确保表头正常写入(方法一第一次会自动生成表头;方法二第一次可将
header设为True) - 确认工作表名称正确,避免因表名错误导致找不到工作表
- 两种方法都能避免覆盖原有数据,可根据数据量和需求选择
内容的提问来源于stack exchange,提问作者Crowbin
相关产品推荐
相关产品推荐

