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

如何用openpyxl将Pandas DataFrame保存到现有Excel工作表并更新全表?

问题描述

我有如下DataFrame:

data = {'Name': ['John', 'Laura', 'Colin', 'David'],
        'Age': [25, 30, 35, 40],
        'City': ['New York', 'London', 'Paris', 'Berlin']}

# 创建DataFrame
df = pd.DataFrame(data)

我想把这个DataFrame导出到已存在的Excel文件Data.xlsx的Sheet1工作表,从A1单元格开始写入,若工作表已有数据则完全更新。尝试了以下代码:

from openpyxl import load_workbook

file_path = 'Data.xlsx'

wb = load_workbook(file_path)

ws = wb['Sheet1']

ws['A1'] = df 

wb.save(file_path)

但出现错误:

[4 rows x 3 columns] to Excel
错误原因

openpyxl的单个单元格只能接收单一值,没法直接把整个DataFrame对象赋值给单元格ws['A1'],这就是报错的根源。

解决方案

有两种实用方法可以实现需求:

方法1:用pandas的ExcelWriter(推荐)

借助pandas自带的ExcelWriter,配合参数可以直接覆盖目标工作表的内容,从A1开始写入:

import pandas as pd

file_path = 'Data.xlsx'

# 打开文件,指定替换已存在的Sheet1
with pd.ExcelWriter(file_path, mode='a', engine='openpyxl', if_sheet_exists='replace') as writer:
    df.to_excel(writer, sheet_name='Sheet1', startrow=0, startcol=0, index=False)
  • mode='a':以追加模式打开已存在的Excel文件
  • if_sheet_exists='replace':如果目标工作表存在,直接替换其全部内容
  • startrow=0, startcol=0:从A1单元格(对应索引0,0)开始写入
  • index=False:不写入DataFrame的索引列

方法2:用openpyxl逐行写入

如果想手动处理,可以先清空工作表原有内容,再把DataFrame的表头和数据逐行写入:

from openpyxl import load_workbook
import pandas as pd

file_path = 'Data.xlsx'
df = pd.DataFrame(data)

wb = load_workbook(file_path)
ws = wb['Sheet1']

# 清空工作表所有内容
ws.delete_rows(1, ws.max_row)

# 写入表头
ws.append(df.columns.tolist())

# 写入数据行
for row in df.itertuples(index=False):
    ws.append(list(row))

wb.save(file_path)
  • 先用delete_rows清空原有数据,确保从A1开始写入新内容
  • 用append方法依次写入表头和每一行数据

内容的提问来源于stack exchange,提问作者just_learning

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 19:48:17