如何在不覆盖文件的情况下向已有Excel工作表写入DataFrame?
解决向已有Excel文件指定工作表写入DataFrame不覆盖的问题
嘿,我来帮你搞定这个问题!你当前的代码会覆盖整个Excel文件,是因为默认创建了全新的ExcelWriter实例,没有加载原有的工作簿。用openpyxl引擎的话,我们可以通过加载已有文件的方式,实现保留原有内容并写入新数据的需求,分两种场景给你解决方案:
场景1:覆盖指定工作表,但保留文件中其他所有工作表
如果你只是想更新test2工作表的内容,同时保留文件里的其他工作表,用这个方法就可以:
import pandas as pd from openpyxl import load_workbook # 第一步:加载已存在的Excel工作簿 book = load_workbook('test.xlsx') # 第二步:创建ExcelWriter对象,并关联已加载的工作簿 writer = pd.ExcelWriter('test.xlsx', engine='openpyxl') writer.book = book # 第三步:将DataFrame写入指定工作表(若该表已存在会被覆盖,不存在则新建) df.to_excel(writer, sheet_name='test2', startcol=10, startrow=20) # 第四步:保存并关闭writer writer.save() writer.close()
场景2:保留指定工作表的原有内容,仅在指定位置写入DataFrame
如果不想清空test2工作表,只是在startrow=20、startcol=10的位置追加DataFrame数据,那需要直接操作工作表的单元格:
import pandas as pd from openpyxl import load_workbook # 加载已存在的工作簿 book = load_workbook('test.xlsx') # 获取目标工作表,不存在则新建 if 'test2' in book.sheetnames: sheet = book['test2'] else: sheet = book.create_sheet('test2') # 遍历DataFrame的每一行每一列,写入到指定位置的单元格 # 注意:Excel的行和列都是从1开始计数的,所以要给startrow和startcol各加1 for row_idx, row_data in enumerate(df.values, start=20 + 1): for col_idx, cell_value in enumerate(row_data, start=10 + 1): sheet.cell(row=row_idx, column=col_idx, value=cell_value) # 保存工作簿 book.save('test.xlsx')
注意事项
- 确保已经安装了
openpyxl库,如果没装可以用命令安装:pip install openpyxl - 第一种场景中,
to_excel会完全覆盖指定的工作表内容,如果你需要保留该表原有数据,一定要用第二种方法
内容的提问来源于stack exchange,提问作者user9187374
相关产品推荐
相关产品推荐

