使用Python实现Excel两列包含关系自动匹配的问题排查
问题原因及解决方法:Excel“包含”查找模拟失效
问题原因
你的代码逻辑错误:searchName in df['Description'].values是检查searchName是否与Description列的某一单元格值完全相等,而你需要的是searchName是否是Description单元格文本的子串(即Excel的“包含”匹配)。这两种匹配逻辑完全不同,导致明明有包含项却全部返回“Not Found”。
比如你示例中的M-023-DXP,代码在找整个单元格值等于它的项,但实际它是某个Description字符串的一部分,所以匹配失败。
解决方法
修改匹配逻辑,检查searchName是否存在于任意一个Description字符串中,同时处理空值避免报错:
方法1:用Pandas字符串方法优化(高效)
利用Pandas的str.contains()批量处理,比逐行循环更高效:
import openpyxl import pandas as pd # 加载工作簿 wb = openpyxl.load_workbook('C:/Code/Python/List of Parts in SAP.xlsx') sheet = wb['Parts'] # 读取BE01的Description列,转为字符串系列方便后续匹配 df = pd.read_excel('C:/Code/Python/List of Parts in SAP.xlsx', sheet_name='BE01', usecols=['Description']) desc_series = df['Description'].astype(str) # 遍历Parts表的行 for rowNum in range(1, sheet.max_row + 1): searchName = sheet.cell(row=rowNum, column=1).value # 处理searchName为空的情况 if not searchName: sheet.cell(row=rowNum, column=8).value = 'Not Found' continue # 检查是否有任意一个Description包含searchName,case=False忽略大小写 if desc_series.str.contains(str(searchName), case=False).any(): sheet.cell(row=rowNum, column=8).value = 'Found' else: sheet.cell(row=rowNum, column=8).value = 'Not Found' # 保存修改后的工作簿 wb.save('updated List of Parts in SAP.xlsx')
方法2:逐行检查(直观)
如果更习惯逐行遍历的逻辑,可以直接循环Description的每个值:
import openpyxl import pandas as pd wb = openpyxl.load_workbook('C:/Code/Python/List of Parts in SAP.xlsx') sheet = wb['Parts'] df = pd.read_excel('C:/Code/Python/List of Parts in SAP.xlsx', sheet_name='BE01', usecols=['Description']) # 把Description列转为字符串列表,处理空值 desc_list = df['Description'].astype(str).tolist() for rowNum in range(1, sheet.max_row + 1): searchName = sheet.cell(row=rowNum, column=1).value found = False if searchName: search_str = str(searchName) # 遍历每个Description文本检查是否包含 for desc in desc_list: if search_str in desc: found = True break sheet.cell(row=rowNum, column=8).value = 'Found' if found else 'Not Found' wb.save('updated List of Parts in SAP.xlsx')
关键改动说明
- 替换匹配逻辑:把精确匹配改为子串包含检查,用
str.contains()或search_str in desc实现Excel的“包含”逻辑 - 空值处理:将所有Description转为字符串,同时判断searchName是否为空,避免
None引发的报错 - 大小写兼容:
case=False参数可以让匹配不区分大小写,和Excel默认查找行为一致
内容的提问来源于stack exchange,提问作者smbonebr
相关产品推荐
相关产品推荐

