Python openpyxl实现Excel两列无配对值查找写入C列代码异常排查
问题根因
- 手动编写循环逐行统计列长度的逻辑容错性极差:如果列中间存在空单元格、带格式残留的空白单元格、值为空字符串的单元格,要么会提前终止循环漏读有效数据,要么会多读无效空值,甚至把
None类型转成字符串'None'混入数据列表,导致匹配逻辑完全失效。 - 读取单元格值时未做空白字符清理:Excel单元格经常携带肉眼不可见的前后空格、换行符、制表符,哪怕两个单元格内容看起来完全一致,携带空白字符和不携带空白字符的字符串判等会直接返回
False,这是代码运行后所有值都被判定为无配对的核心原因。 - 存在逻辑小bug:代码实际保存的文件名为
[原文件名]_odvojeno.xlsx,但运行完成后打印的提示是保存为[原文件名]_edited.xlsx,文件名不匹配会导致运行后找不到输出文件。
修复方案
- 直接调用openpyxl自带的
max_row属性获取工作表当前有数据的最大行号,放弃手动计数的逻辑,从根源避免计数错误。 - 读取单元格值时先判空,非空值统一做前后空白截断(
.strip())后再转小写,彻底清除不可见字符对匹配结果的影响。 - 用Python集合的对称差运算直接计算两列不共有的值,相比循环写
not in判断更简洁高效,还能自动对重复值去重。
修正后可直接运行的代码
from openpyxl import load_workbook print("file name: ") name = input().strip() try: wb = load_workbook(f"{name}.xlsx") ws = wb.active except: print("Document doesn't exist, it isn't a .xlsx document or is not in the same directory as the program") exit() a_vals = [] b_vals = [] max_row = ws.max_row # 逐行读取两列有效值,统一做清洗 for row in range(1, max_row + 1): # 读取A列 a_val = ws.cell(row=row, column=1).value if a_val is not None: clean_a = str(a_val).strip().lower() if clean_a: a_vals.append(clean_a) # 读取B列 b_val = ws.cell(row=row, column=2).value if b_val is not None: clean_b = str(b_val).strip().lower() if clean_b: b_vals.append(clean_b) # 计算两列中没有配对的值 unpaired_vals = list(set(a_vals).symmetric_difference(set(b_vals))) # 写入C列 ws['C1'] = "values without pairs:" for idx, val in enumerate(unpaired_vals, start=2): ws[f'C{idx}'] = val # 保存文件,文件名和提示保持一致 output_file = f"{name}_edited.xlsx" wb.save(output_file) print(f"document saved as {output_file}")
运行上述代码,用提供的示例数据测试,C列只会写入zk/523423,完全符合需求。
内容的提问来源于stack exchange,提问作者farima4
相关产品推荐
相关产品推荐

