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

使用openpyxl匹配两个Excel文件个体ID仅能找到首条匹配项求助

跨Excel文件按个体ID匹配数据的问题修复

现有代码的核心错误

  • 内层遍历第二个表格时没有重置patient2变量,第一次遍历结束后如果patient2被赋值为空值,后续遍历会直接触发break跳出循环,因此只能找到第一条匹配
  • 内外层循环都使用row作为行变量名,会覆盖外层的行数据,导致外层遍历异常
  • openpyxl的行索引从1开始,ws2.iter_rows(min_row=0)的参数设置错误,不会生效
  • 逐单元格双重遍历的逻辑冗余,没有必要遍历所有单元格来提取ID和表头,执行效率极低

优化后实现方案

推荐先将第二个表的个体ID和对应行的映射关系提前存入字典,仅需一次遍历即可完成后续所有匹配查询,逻辑更清晰也不会出现循环异常问题,参考代码如下:

import openpyxl

# 加载两个工作簿
wb_target = openpyxl.load_workbook('/Users/miguelnobremenezes/Documents/Code/Excel_fill/45_24M_ECOCARDIOGRAMA.xlsx')
ws_target = wb_target.active

wb_source = openpyxl.load_workbook('/Users/miguelnobremenezes/Documents/Code/Excel_fill/echo_CB.xlsx')
ws_source = wb_source.active

# 第一步:先构建源文件的ID-行号映射字典,一次遍历即可
id_row_map = {}
# 跳过表头行从第2行开始遍历源文件
for row_num in range(2, ws_source.max_row + 1):
    patient_id = ws_source.cell(row=row_num, column=1).value
    if patient_id:  # 跳过ID为空的行
        id_row_map[patient_id] = row_num

# 第二步:遍历目标文件匹配ID
# 跳过表头从第2行开始
for target_row in range(2, ws_target.max_row + 1):
    target_id = ws_target.cell(row=target_row, column=1).value
    # 查字典看ID是否存在于源文件
    if target_id in id_row_map:
        print(f"匹配成功,个体ID:{target_id}")
        source_row = id_row_map[target_id]
        # 后续可补充表头匹配、参数赋值逻辑:
        # for col in range(2, ws_target.max_column +1):
        #     header = ws_target.cell(row=1, column=col).value
        #     到源文件查找对应表头的列完成赋值即可

# 保存修改后的目标文件可取消注释下方代码
# wb_target.save("填充完成的文件.xlsx")

如果仍要保留原双重循环逻辑修改,只需在每次遍历ws2前重置patient2 = 0,修改min_row=2跳过表头,同时重命名内层行变量即可,但字典映射方案执行效率要高出数个量级,更推荐使用。

内容的提问来源于stack exchange,提问作者Miguel Nobre Menezes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:06:03