使用 Python 在 Excel 中识别并高亮重复数据与唯一数据

汇总多份报名表时,邮箱地址重复意味着有人重复提交;核对库存清单时,重复的商品编码说明台账里存在两条记录;而在排查录入错误时,我们反而更关心只出现了一次的"唯一值",因为它们往往是遗漏或拼写错误的结果。无论哪一种,靠肉眼看几千行数据都不现实。

Excel 自带的"条件格式 → 重复值"功能可以解决这个问题,但它是交互式操作:每换一份文件就要重新选区域、选颜色规则。用 Python 则可以把这套判断固化成脚本,批量套用到任意多的工作表上。本文介绍用 Spire.XLS for Python 在程序中查找并高亮重复值与唯一值的方法。

为什么用脚本处理重复值检查

  • 批量执行:几十个工作表、几十份文件套用同一套规则,不需要逐个点击。
  • 规则可复用:颜色、范围、判断类型都写在代码里,换一份数据只需改文件名。
  • 结果可追溯:脚本把标记结果写入新文件,原始数据保持不变,便于比对。

环境准备

安装 Spire.XLS:

bash 复制代码
pip install Spire.XLS

在脚本中导入需要的模块:

python 复制代码
from spire.xls import *
from spire.xls.common import *

两个专用条件格式方法

Spire.XLS 的条件格式入口是工作表的 ConditionalFormats 集合。常规做法是先 Add() 新建一条规则、用 AddRange() 指定作用区域,再用 AddCondition() 添加条件并设置 FormatType。对于重复值与唯一值,还有两个语义更明确的专用方法:

方法 作用
AddDuplicateValuesCondition() 高亮区域内出现两次及以上的值
AddUniqueValuesCondition() 高亮区域内只出现一次的值

两者的判断范围都是 AddRange() 指定的区域。换句话说,"是否重复"是在所选范围内比较得出的,与区域外的数据无关。设置好条件后,通过 FillPattern、BackColor、FontColor 等属性决定最终外观。

高亮重复值

下面的例子在成绩表的学号列中找出重复项,并用粉色底纹标出:

python 复制代码
from spire.xls import *
from spire.xls.common import *

workbook = Workbook()
workbook.LoadFromFile("Template_Xls_6.xlsx")
sheet = workbook.Worksheets[0]

# 新建一条条件格式规则并限定作用区域
conds = sheet.ConditionalFormats.Add()
conds.AddRange(sheet.Range["C2:C10"])

# 添加重复值条件
cf = conds.AddDuplicateValuesCondition()
cf.FillPattern = ExcelPatternType.Solid
cf.BackColor = Color.get_IndianRed()

workbook.SaveToFile("HighlightDuplicates.xlsx", ExcelVersion.Version2010)
workbook.Dispose()

AddDuplicateValuesCondition() 不接收参数------它本身就是"重复值"这个判断。FillPattern = ExcelPatternType.Solid 指定填充方式为实心,BackColor 才是实际的颜色;如果不设置 FillPattern,只设颜色往往看不到填充效果,这是使用条件格式时最常见的疏漏。若还想让重复项的文字变色,再加上 cf.FontColor = Color.get_White() 即可。

同时标记重复值与唯一值

唯一值的写法完全对称,换成 AddUniqueValuesCondition() 即可。把两条规则套用到同一区域,区域内每一个非空单元格都会被标上颜色:出现两次以上的是一种颜色,只出现一次的另一种颜色,适合用来快速浏览一份数据的取值分布。

python 复制代码
from spire.xls import *
from spire.xls.common import *

workbook = Workbook()
workbook.LoadFromFile("Template_Xls_6.xlsx")
sheet = workbook.Worksheets[0]

# 规则一:重复值标记为印度红
xcfs = sheet.ConditionalFormats.Add()
xcfs.AddRange(sheet.Range["C2:C10"])
dup = xcfs.AddDuplicateValuesCondition()
dup.FillPattern = ExcelPatternType.Solid
dup.BackColor = Color.get_IndianRed()

# 规则二:唯一值标记为黄色
xcfs1 = sheet.ConditionalFormats.Add()
xcfs1.AddRange(sheet.Range["C2:C10"])
uniq = xcfs1.AddUniqueValuesCondition()
uniq.FillPattern = ExcelPatternType.Solid
uniq.BackColor = Color.get_Yellow()

workbook.SaveToFile("DuplicateAndUnique.xlsx", ExcelVersion.Version2010)
workbook.Dispose()

关键点是两条规则必须各自调用一次 ConditionalFormats.Add(),再分别 AddRange()。如果把第二个条件加到第一条规则集合上,区域和颜色都会与预期不符------这个坑在示例代码里也很常见,写的时候留意一下 AddRange() 的宿主对象是否与条件对应。

批量应用到多个工作表

一份台账往往有多张结构相同的月度表,循环遍历即可复用同一套规则:

python 复制代码
for i in range(workbook.Worksheets.Count):
    sheet = workbook.Worksheets.get_Item(i)

    xcfs = sheet.ConditionalFormats.Add()
    xcfs.AddRange(sheet.Range["C2:C10"])
    cf = xcfs.AddDuplicateValuesCondition()
    cf.FillPattern = ExcelPatternType.Solid
    cf.BackColor = Color.get_IndianRed()

Worksheets.Count 给出工作表总数,get_Item(i) 按索引取出每一张。如果各表的列数不一致,把固定区域 C2:C10 换成 sheet.AllocatedRange 之类的动态区域会更稳妥。

实用建议

  • 别忘了 FillPattern:只设置颜色而不设置填充方式,条件格式在 Excel 中可能不显示填充。
  • 区域决定判断结果 :把区域选成 A2:B100 时,行与行之间的重复也会被算作重复;只想按单列去重时,区域就只选那一列。
  • 规则过多会影响性能:条件格式的范围越大、规则越多,Excel 打开文件时的计算量越高,建议只覆盖实际有数据的区域。
  • 及时释放资源 :处理完一个工作簿后调用 workbook.Dispose();批量场景逐个加载、处理、保存。

结语

本文介绍了使用 Python 在 Excel 中查找并高亮重复值与唯一值的方法:通过 ConditionalFormats.Add() 建立规则、AddRange() 限定判断区域,再用 AddDuplicateValuesCondition() 与 AddUniqueValuesCondition() 分别标记两类数据,并用 FillPattern、BackColor 等属性控制外观。由于判断基于所选区域,同一套代码可以直接用于数据清洗之前的重复检查,也可以配合工作表循环覆盖整本工作簿。

相关推荐
艺杯羹43 分钟前
Windows跨平台编码地雷全解:从GBK静默崩溃到内核级原子写入防御
人工智能·python·桌面客户端
CCblandy44 分钟前
Agent 工具调用怎么编排?本机实测:并行只到 2.63 倍,慢的先发省 30ms,CPU 活加 worker 无效
人工智能·后端·python·性能优化
茉莉玫瑰花茶1 小时前
GO [ 标准库 ]
开发语言·后端·golang
用户8356290780511 小时前
使用 Python 在 Excel 中查找、替换数据并高亮显示
后端·python
GPU实战笔记1 小时前
PyCharm 接云 GPU:远端项目连接与远程解释器别混为一谈
python·pycharm·ssh·远程开发·云gpu
范中勤1 小时前
Python 协程(Coroutine)通俗讲解与技术原理:从 await 挂起到 Agent 高并发
python·agent·协程·并发编程·asyncio
2601_966949652 小时前
如何判断实时行情数据是否已经更新?从时间戳、交易时段到行情有效性
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
MoRanzhi12032 小时前
106.正则问题(分治)
python·算法·正则表达式·蓝桥杯·递归·分治算法·字符串处理