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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:22:30