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写入模式,仅修改目标区域数据,完全保留其他内容。
先安装依赖:
pip install pandas openpyxl可直接运行的修正代码:
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
相关产品推荐
相关产品推荐

