使用openpyxl将字典值填充至Excel对应列时遇类型错误求助
问题分析与解决
错误原因
你遇到的TypeError和写入失败主要有两个核心问题:
- 只读模式无法修改:加载工作簿时用了
read_only=True,这种模式下只能读取数据,不能修改单元格内容;同时iter_rows不支持字符串列标识(比如'A')作为参数,它需要整数类型的列索引,这直接触发了类型错误。 - 误用内置关键字:
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
相关产品推荐
相关产品推荐

