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
相关产品推荐
相关产品推荐

