You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不覆盖文件的情况下向已有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:05:52