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

Python pandas遍历Excel工作表更新单元格区域时数据丢失问题

问题根因
  • pd.ExcelFile是pandas实现的只读Excel解析类,本身不支持对原工作簿的增量写入,直接调用df.to_excel(wb, ...)时pandas会生成全新的空白工作簿写入数据,原文件内所有其他工作表、非目标区域的内容都会被覆盖清空。
  • 原代码存在两个额外错误:一是读取区域列起始索引为2(对应Excel C列),但写入时startcol=3从D列开始,会出现列错位;二是wb.save(path))多写了一个右括号,会直接触发语法错误。
解决方案

使用支持读写现有Excel文件的openpyxl作为操作引擎,搭配pandas的overlay写入模式,仅修改目标区域数据,完全保留其他内容。

  1. 先安装依赖:
    pip install pandas openpyxl

  2. 可直接运行的修正代码:

import pandas as pd
from openpyxl import load_workbook

path = '<folder location>.xlsx'
# 加载完整原工作簿,所有原有内容会被保留
wb = load_workbook(path)

for sht in ['sheet1','sheet2','sheet3']:
    # 读取指定区域数据:索引从0开始,skiprows=607对应第608行,range(2,15)对应C列到O列
    df = pd.read_excel(path, sheet_name=sht, skiprows=607, nrows=11, usecols=range(2,15))
    
    # 在此处添加你的DataFrame处理逻辑
    # 处理示例:df = df.fillna(0)

    # 初始化写入器,绑定现有工作簿,使用叠加写入模式
    with pd.ExcelWriter(
        path,
        engine='openpyxl',
        mode='a',
        if_sheet_exists='overlay'
    ) as writer:
        writer.book = wb
        # 写入原位置:关闭索引和表头写入避免错位,行列起始位置和读取参数完全对齐
        df.to_excel(
            writer,
            sheet_name=sht,
            startrow=607,
            startcol=2,
            index=False,
            header=False
        )

# 保存修改并关闭工作簿
wb.save(path)
wb.close()
关键注意事项
  • if_sheet_exists='overlay'是核心配置:该参数会告知pandas不要清空重建目标工作表,仅在指定的行列位置写入DataFrame数据,其余单元格内容、其他工作表完全不受影响。
  • 写入时必须携带index=False和header=False参数:读取区域数据时没有读入pandas生成的默认索引、也不需要写入新的表头,不加这两个参数会导致数据多出行/列,覆盖原有内容。
  • 行列参数必须对齐:读取时skiprows=607对应起始行索引607,usecols=range(2,15)对应起始列索引2,写入时startrow和startcol必须和这两个值一致,才会精准写回原区域。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:24:25