使用Pandas向Excel工作表追加数据时覆盖原有数据问题求助
解决方法
问题根源
pd.ExcelWriter默认使用mode='w'写入模式,会直接覆盖原有文件全部内容,是原有数据丢失的核心原因- 写死
startrow=2不符合追加逻辑,需要动态获取目标工作表现有数据的行数确定起始写入位置
修正后代码(适用于pandas ≥1.4.0)
import pandas as pd from openpyxl import load_workbook # 加载已有Excel文件,设置追加模式 book = load_workbook('Total_Orders.xlsx') writer = pd.ExcelWriter( 'Total_Orders.xlsx', engine='openpyxl', mode='a', if_sheet_exists='overlay' ) writer.book = book # 动态获取目标工作表最大行数,作为新数据写入起始位置 target_sheet = writer.sheets['Orders'] start_row = target_sheet.max_row # 写入新数据,不添加表头、不保留索引 append_data.to_excel( writer, sheet_name='Orders', startrow=start_row, header=False, index=False ) writer.save() writer.close()
低版本pandas兼容方案(pandas <1.4.0)
如果pandas版本不支持if_sheet_exists参数,可采用新旧数据合并后全量写入的方式,10万行数据量下性能更稳定:
import pandas as pd # 读取原有工作表数据 old_data = pd.read_excel('Total_Orders.xlsx', sheet_name='Orders') # 合并新旧数据 all_data = pd.concat([old_data, append_data], ignore_index=True) # 全量写入工作表 with pd.ExcelWriter('Total_Orders.xlsx', engine='openpyxl') as writer: all_data.to_excel(writer, sheet_name='Orders', index=False)
额外注意
你读取Orders.xlsx的代码存在两处可修正问题:
pd_ExcelFile应改为pd.ExcelFile- 需要提前初始化
append_data = [],并定义worksheets = sheet_file.sheet_names获取工作表列表,否则运行会报错
内容的提问来源于stack exchange,提问作者ckp
相关产品推荐
相关产品推荐

