Python对比Excel并在源文件标记

想用Python写一个脚本,根据需求ID,自动标记对应的单元格
单元格有单条需求ID时,一切正常,但是通过一条ID,匹配单元格内有多条需求ID时,无法匹配到

例如:我要将包含“263218”的单元格标记

img

代码如下:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 导入模块 openpyxl
import openpyxl
from openpyxl.styles import PatternFill
from openpyxl.styles import colors
from openpyxl.styles import Font, Color
import copy

# 读取excel文件
# 括号中的字符串为你要比较的两个excel的路径,注意用“/”
wb_a = openpyxl.load_workbook('D:/DB/G4.xlsx')
wb_b = openpyxl.load_workbook('D:/DB/DX.xlsx')

# 定义一个方法来获取表格中某一列的内容,返回一个列表
# 将每一列输出为一个列表(temp表示列的名字)
def getIP(wb, temp):
    sheet = wb.active
    ip = []
    for cellobj in sheet[temp]:
        ip.append(cellobj.value)
    return ip

# 想比较哪几列就输入那几列的名称
list1 = ['E']
list2 = []  # 用于存每列不同的值
differ1 = {}  # 第一个文件中每列不同的列表组成字典
differ2 = {}  # 第二个文件中每列不同的列表组成字典
for temp1 in list1:
    # 获得ip列表
    ip_a = getIP(wb_a, temp1)
    ip_b = getIP(wb_b, temp1)
    # 将两个列表转换成集合
    aa = set(ip_a)
    bb = set(ip_b)
    # 找出两个列表的不同行,并转换成列表
    # difference = str(aa) in str(bb)
    # union_aa_bb = set(aa).union(bb)
    intersection_aa_bb = set(aa).intersection(set(bb))
    # 打印出列表中的元素
    # 到这一步,两个表格中不同的数据已经被找出来了
    # 将不同行高亮显示
    # print ("开始第一张表" + "----" *10)
    del list2[0:]
    a = wb_a.active[temp1]
    for cellobj in a:
        if cellobj.value in intersection_aa_bb:
            cellobj.fill = PatternFill("solid", fgColor="DD232B")
            list2.append(cellobj.value)
    if list2 != []:
        differ1[temp1] = copy.deepcopy(list2)
    # print ("开始第二张表" + "----" *10)
    del list2[0:]
    b = wb_b.active[temp1]
    for cellobj in b:
        if cellobj.value in intersection_aa_bb:
            cellobj.fill = PatternFill("solid", fgColor="DD232B")
            list2.append(cellobj.value)
    if list2 != []:
        differ2[temp1] = copy.deepcopy(list2)

print(differ1.items())
print(differ2.items())
wb_a.save('D:/DB/G4.xlsx')
wb_b.save('D:/DB/DX.xlsx')

用什么方法能匹配到呢

cellobj.value本身含有多行文本,你先split('\n')之后循环比对,或者转set之后做集合与运算(这样效率更高而且不用循环)

# 获取第column列的值,返回该列的平均值
def list_col_value(sheet, column, length):
    col_count = 0
    for i in range(1, length + 1): 
        cell_value = sheet.cell(i, column).value 
        col_count += int(cell_value)
    return col_count/length

在这种情况下,你可以使用 Python 的正则表达式模块 re 来匹配多个需求 ID。

例如,假设你有一个单元格,内容如下:

cell = "需求ID: 123, 456, 789"

你可以使用如下代码来匹配所有需求 ID:

import re

匹配所有数字,并将它们保存到一个列表中
ids = re.findall(r'\d+', cell)

输出 ['123', '456', '789']
print(ids)

然后,你就可以遍历列表中的每个 ID,并根据需要对单元格进行标记。