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

Python实现Excel相似名称排序与同色标记问题求助

解决Excel相似名称行批量着色问题

你的代码已经实现了相似名称的排序,但着色功能缺失核心逻辑——没有为每组相似名称分配独立颜色,且原printExcel里的行收集逻辑还存在错误(内层循环误把item2写成item,导致重复添加同一行)。下面是修正后的完整解决方案,同时优化了处理效率:

关键改进点

  • 为每组相似名称生成唯一的浅色调填充色,避免颜色过深影响文字可读性
  • 用pandas批量处理数据,替代openpyxl逐行遍历查找,大幅提升效率
  • 修正行收集逻辑的错误,确保相似名称的行正确归类
  • 写入Excel时直接为对应分组的行绑定并应用颜色

完整代码

import pandas as pd
from difflib import SequenceMatcher
import json
import openpyxl
from openpyxl.styles import PatternFill
import random

def readExcel():
    df = pd.read_excel('tedarikci.xlsx')
    isimler = df['Müşteri/tedarikçi ismi'].tolist()

    def searchInDict(dataDict, item):
        if item in dataDict.keys():
            return False
        for parent in dataDict.keys():
            if item in dataDict[parent]:
                return False
        return True
            
    benzerIsimler = {}
    for i, item in enumerate(isimler):
        if searchInDict(benzerIsimler, item):
            benzerIsimler[item] = []
            for j, item2 in enumerate(isimler):
                if item != item2:
                    score = SequenceMatcher(None, item, item2).ratio()
                    if score > 0.9:
                        benzerIsimler[item].append(item2)

    with open("dataMusteri.json", "w") as outfile:
        json.dump(benzerIsimler, outfile)

def printExcel():
    # 加载相似名称分组数据
    with open("dataMusteri.json", "r") as outfile:
        benzerIsimler = json.load(outfile)

    # 生成随机浅色调填充色,避免深色遮挡文字
    def get_random_fill():
        r = random.randint(180, 255)
        g = random.randint(180, 255)
        b = random.randint(180, 255)
        return PatternFill(start_color=f"{r:02X}{g:02X}{b:02X}",
                           end_color=f"{r:02X}{g:02X}{b:02X}",
                           fill_type="solid")
    
    # 建立所有名称到对应颜色的映射,确保同组名称共用同一颜色
    name_color_map = {}
    for group_name in benzerIsimler.keys():
        fill = get_random_fill()
        name_color_map[group_name] = fill
        for similar_name in benzerIsimler[group_name]:
            name_color_map[similar_name] = fill

    # 用pandas高效读取并排序原始数据
    df = pd.read_excel('tedarikci.xlsx')
    sorted_data = []
    # 按分组顺序整理数据
    for group_name in benzerIsimler.keys():
        sorted_data.extend(df[df['Müşteri/tedarikçi ismi'] == group_name].to_dict('records'))
        for similar_name in benzerIsimler[group_name]:
            sorted_data.extend(df[df['Müşteri/tedarikçi ismi'] == similar_name].to_dict('records'))
    sorted_df = pd.DataFrame(sorted_data)

    # 写入Excel并为对应行着色
    with pd.ExcelWriter('dilara.xlsx', engine='openpyxl') as writer:
        sorted_df.to_excel(writer, index=False, sheet_name='Sheet1')
        ws = writer.sheets['Sheet1']
        # 从第二行开始(第一行是表头)为每行应用颜色
        for row_num in range(2, len(sorted_df)+2):
            current_name = ws.cell(row=row_num, column=1).value
            if current_name in name_color_map:
                # 为当前行所有单元格应用填充色
                for col_num in range(1, len(sorted_df.columns)+1):
                    ws.cell(row=row_num, column=col_num).fill = name_color_map[current_name]

# 先运行分组生成,再生成带颜色的Excel
readExcel()
printExcel()

内容的提问来源于stack exchange,提问作者dilara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 21:45:11