使用openpyxl对比Excel中GUID与指定数组,修复结果列写入异常
两段openpyxl代码的错误分析与修正方案
第一段代码错误分析与修正
错误原因
- 嵌套循环逻辑混乱:外层遍历
converted_data(每行的字典数据),内层又重复遍历所有行号,导致每次外层循环都会覆盖所有Result列单元格,最终只有最后一次循环的结果生效。 - 变量
i的使用逻辑错误:代码先给cell.value = i,但此处i是之前读取行的循环变量,后续赋值为结果字符串后,所有单元格都会被覆盖成同一个值,完全没对应到每行的实际GUID。 - 仅硬编码对比单个GUID,未使用指定的GUID数组,无法匹配多个目标GUID。
修正后的代码
from openpyxl import load_workbook from openpyxl.styles import Font wb = load_workbook(r'filepath', data_only=True) ws = wb['TDSheet'] rows = ws.max_row # 定义要对比的GUID集合(用集合可提升查询效率) target_guids = {'f4407e0e-0e7e-11e9-b803-0cc47a6c65db', 'f4407e0d-0e7e-11e9-b803-0cc47a6c65db'} # 添加Result列表头并设置样式 ws["M1"] = 'Result' ws["M1"].font = Font(bold=True) # 直接遍历数据行(从第2行开始) for row_num in range(2, rows + 1): # 通过表头找到GUID列的位置,避免硬编码列索引 guid_col = ws.cell(row=1, value="GUID").column current_guid = ws.cell(row=row_num, column=guid_col).value # 判断当前GUID是否在目标集合中 ws.cell(row=row_num, column=13).value = 'GUID found' if current_guid in target_guids else 'GUID not found' wb.save('test_Excel.xlsx')
第二段代码错误分析与修正
错误原因
- 行/列遍历逻辑颠倒:
for col in ws是遍历工作表的每一列,而非每一行,col[7].value取的是该列第8行的单元格值,完全不是每行的GUID数据。 - 三层嵌套循环逻辑错误:遍历错误获取的
g、目标gc后又遍历所有行,导致每次循环都会覆盖所有Result单元格,最终仅保留最后一次循环的结果。 - 未对应行号赋值:获取的GUID与行号完全不匹配,无法给对应行标记正确结果。
修正后的代码
from openpyxl import load_workbook from openpyxl.styles import Font wb = load_workbook(r'filepath', data_only=True) ws = wb['TDSheet'] rows = ws.max_row # 定义目标GUID集合 guids_control = {'f4407e0d-0e7e-11e9-b803-0cc47a6c65db', 'f4407e20-0e7e-11e9-b803-0cc47a6c65db'} # 添加Result列表头并设置样式 ws["M1"] = 'Result' ws["M1"].font = Font(bold=True) # 遍历数据行(从第2行开始),假设GUID在第8列(可根据实际调整列索引) for row_num in range(2, rows + 1): current_guid = ws.cell(row=row_num, column=8).value ws.cell(row=row_num, column=13).value = 'GUID found' if current_guid in guids_control else 'GUID not found' wb.save('test_Excel.xlsx')
通用优化说明
- 使用集合存储目标GUID:集合的
in查询操作时间复杂度为O(1),远快于列表的O(n),数据量大时效率提升明显。 - 直接操作工作表单元格:无需将所有数据转换成字典,节省内存且逻辑更简洁。
- 通过表头定位GUID列:避免硬编码列索引,提升代码的通用性。
内容的提问来源于stack exchange,提问作者Pauline Rumyantseva
相关产品推荐
相关产品推荐

