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

使用openpyxl将字典值填充至Excel对应列时遇类型错误求助

问题分析与解决

错误原因

你遇到的TypeError和写入失败主要有两个核心问题:

  1. 只读模式无法修改:加载工作簿时用了read_only=True,这种模式下只能读取数据,不能修改单元格内容;同时iter_rows不支持字符串列标识(比如'A')作为参数,它需要整数类型的列索引,这直接触发了类型错误。
  2. 误用内置关键字:dict是Python内置类型,用作变量名会覆盖内置功能,可能引发潜在问题。

修复后的基础代码

from openpyxl import load_workbook

# 避免用内置关键字dict当变量名
file_dict = {'file_a': 20, 'file_b': 30, 'file_c': 40}

file_path = 'spreadsheey.xlsx'
# 去掉read_only=True,默认是可读写模式
wb = load_workbook(file_path)
ws = wb.active

def populate_row(filename, length):
    # 用整数列索引指定A列(对应索引1),遍历行
    for row in ws.iter_rows(min_col=1, max_col=1):
        for cell in row:
            if cell.value == filename:
                ws.cell(row=cell.row, column=2).value = length

for key, value in file_dict.items():
    populate_row(key, value)

# 必须保存才能将修改写入文件
wb.save(file_path)

更高效的实现方法

上面的代码每次遍历字典键都要扫描一遍A列,数据量大时效率低下。可以先把A列的文件名与对应行号提前映射成字典,再批量写入,只需要遍历A列一次:

from openpyxl import load_workbook

file_dict = {'file_a': 20, 'file_b': 30, 'file_c': 40}
file_path = 'spreadsheey.xlsx'

wb = load_workbook(file_path)
ws = wb.active

# 先构建A列文件名到行号的映射表
name_to_row = {}
for row_num, cell in enumerate(ws['A'], start=1):
    filename = cell.value
    if filename in file_dict:
        name_to_row[filename] = row_num

# 批量写入B列对应位置
for filename, length in file_dict.items():
    if filename in name_to_row:
        ws.cell(row=name_to_row[filename], column=2).value = length

wb.save(file_path)

代码说明

  • 直接遍历ws['A']可以更简洁地获取A列所有单元格,结合enumerate直接拿到行号。
  • 提前构建映射表,把原代码O(n*m)的时间复杂度降到O(n+m)(n是A列行数,m是字典键数量),数据量大时优势明显。
  • 必须调用wb.save()才能将修改持久化到文件,这是之前代码遗漏的关键步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:50:39