如何用dataframe数据更新现有Excel?openpyxl代码无报错不生效
问题说明
需要将名为CF的DataFrame数据更新到现有Excel电子表格,运行代码无报错,但表格内容未发生任何更新,相关代码如下:
import openpyxl as ox def update_spreadsheet(path : str ='/a123.xlsx', _df = CF, starcol : int = 1, startrow : int = 1, sheet_name : str ="TDSheet"): wb = ox.load_workbook(path) for ir in range(0, len(_df)): for ic in range(0, len(_df.iloc[ir])): wb[sheet_name].cell(startrow + ir, starcol + ic).value = _df.iloc[ir][ic] wb.save(path)
问题原因排查
- 仅定义函数未调用:代码只完成了函数逻辑的声明,没有执行
update_spreadsheet()调用语句,所有写入逻辑根本没有触发,是最高发的原因。 - 默认参数绑定异常:Python函数默认参数在定义阶段就会完成值绑定,如果你是先定义了这个函数,后续才给
CF变量赋值处理好的DataFrame,函数内默认拿到的_df是定义函数时CF的初始值(空值或旧数据),不会读取后续更新的CF内容。 - 参数拼写笔误:列起始位置参数错写为
starcol(正确拼写应为startcol),如果调用函数时按正确拼写传入列位置参数,不会被函数识别,会始终用默认值1写入,和预期位置不符。 - 文件路径/访问异常:
- 代码中写的路径是
/a123.xlsx,Windows系统下该路径指向当前盘符根目录,如果你实际编辑的文件存放在其他文件夹,程序会写入根目录下的同名文件,你打开其他路径的文件自然看不到更新。 - 运行代码时如果目标Excel文件正被WPS/Office打开,文件会被进程锁定,部分环境下save操作不会抛出显性报错,但实际写入会被拦截,数据不会更新到打开的文件中。
- 代码中写的路径是
- 取值逻辑隐患:代码用
_df.iloc[ir][ic]链式写法取值,当DataFrame索引不是默认连续整数索引、列映射关系特殊时,可能取到空值或错位数据,导致写入内容不符合预期。
修复后参考代码
import openpyxl as ox import pandas as pd # 此处完成CF的所有数据处理逻辑,确保调用函数时CF是最终要写入的DataFrame # 示例:CF = pd.read_excel("源数据.xlsx") def update_spreadsheet(path: str = './a123.xlsx', startcol: int = 1, startrow: int = 1, sheet_name: str = "TDSheet"): _df = CF wb = ox.load_workbook(path) ws = wb[sheet_name] # 优化遍历逻辑,避免链式索引取值问题 for row_idx, row in enumerate(_df.values): for col_idx, val in enumerate(row): ws.cell(row=startrow + row_idx, column=startcol + col_idx, value=val) wb.save(path) # 调用前先关闭所有打开的目标Excel文件,再执行函数 update_spreadsheet()
内容的提问来源于stack exchange,提问作者Andrey Nikitin
相关产品推荐
相关产品推荐

