在日常的数据处理工作中,快速定位关键信息往往是第一道门槛。无论是标记异常值、突出核心指标,还是识别重复数据,能够精准地高亮显示特定内容,都能让数据审查和分析的效率提升一个档次。今天,我们就来聊聊如何借助 Spire.XLS for Python 这个工具,在 Excel 里实现各种灵活的查找与高亮操作。从最基础的文本匹配,到基于条件格式的动态更新,再到排名、重复值、平均值等高级玩法,这次争取一次讲透。
环境准备
开始之前,需要先把 Spire.XLS for Python 装上,一条 pip 命令搞定:
pip install Spire.XLS
装完之后,就可以在 Python 项目里操作 Excel 文档,执行各种查找和高亮任务了。
查找并高亮的典型应用场景
在实际工作中,Excel 查找并高亮的需求几乎无处不在:
- 数据审查:快速定位包含特定关键词的单元格,比如搜索“缺货”、“异常”。
- 异常检测:标记超出正常范围的数据,比如销售额突然暴跌的记录。
- 重复数据识别:一眼发现重复录入的订单号或客户信息。
- 排名分析:突出显示销量前十的产品,或者预算后五的项目。
- 趋势分析:标记高于或低于平均值的数值,帮你理解数据分布。
- 关键字段标注:对重要字段加上视觉强调,避免遗漏。
Spire.XLS for Python 提供了两种主流的做法:一种是直接设置单元格背景色,适合一次性的静态高亮;另一种是用条件格式化,它最大的优势是——数据变了,高亮会自动更新。接下来逐一展开。
查找文本并高亮显示
最基础的操作:在工作表里搜索某个字符串,然后把匹配到的单元格涂上颜色。下面这个例子演示了如何查找所有包含“缺货”的单元格并标黄:
from spire.xls import *
from spire.xls.common import *
def FindAndHighlightText():
"""查找特定文本并高亮显示"""
inputFile = "/input/销售报告.xlsx"
outputFile = "/output/FindAndHighlight.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
worksheet = workbook.Worksheets[0]
# 查找所有包含 "缺货" 的单元格,区分大小写,完全匹配
ranges = worksheet.FindAllString("缺货", True, True)
for range in ranges:
range.Style.Color = Color.get_Yellow()
workbook.Sa veToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()
if __name__ == "__main__":
FindAndHighlightText()

这里用到了 FindAllString() 方法,前两个布尔参数分别控制“是否区分大小写”和“是否完全匹配”。返回的是一组单元格范围,遍历后直接设置背景色即可。这种方法简单粗暴,适合一次性操作,高亮结果永久保存在文件里,不会因为数据变化而自动更新。
使用条件格式化高亮排名前后的值
条件格式化就聪明多了——它会根据单元格的实际值动态决定是否高亮。比如,你想自动挑出销售额最高的前两名和最低的后两名:
from spire.xls import *
from spire.xls.common import *
def HighlightRankedValues():
"""高亮显示排名前后的值"""
inputFile = "/input/销售报告.xlsx"
outputFile = "/HighlightRankedValues.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
sheet = workbook.Worksheets[0]
# 高亮范围 B3:B16 中的前 2 个最大值
xcfs = sheet.ConditionalFormats.Add()
xcfs.AddRange(sheet.Range["B3:B16"])
format1 = xcfs.AddTopBottomCondition(TopBottomType.Top, 2)
format1.FormatType = ConditionalFormatType.TopBottom
format1.BackColor = Color.get_Red()
# 高亮范围 E3:E16 中的后 2 个最小值
xcfs1 = sheet.ConditionalFormats.Add()
xcfs1.AddRange(sheet.Range["E3:E16"])
format2 = xcfs1.AddTopBottomCondition(TopBottomType.Bottom, 2)
format2.FormatType = ConditionalFormatType.TopBottom
format2.BackColor = Color.get_ForestGreen()
workbook.Sa veToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()
if __name__ == "__main__":
HighlightRankedValues()

通过 AddTopBottomCondition() 方法,你可以指定是最大值还是最小值,以及要保留的个数。条件格式化的好处在于:如果数据更新了,高亮会自动重新计算。这在销售分析、成绩排名、性能评估等场景中特别实用,省去了手动调整的麻烦。
高亮显示重复值和唯一值
数据清理时,重复项和唯一项往往是重点关注对象。用条件格式化来实现同样很简单:
from spire.xls import *
from spire.xls.common import *
def HighlightDuplicateAndUnique():
"""高亮显示重复值和唯一值"""
inputFile = "/input/销售报告.xlsx"
outputFile = "/HighlightDuplicateUniqueValues.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
sheet = workbook.Worksheets[0]
# 高亮范围 C3:C16 中的重复值
xcfs = sheet.ConditionalFormats.Add()
xcfs.AddRange(sheet.Range["C3:C16"])
format1 = xcfs.AddCondition()
format1.FormatType = ConditionalFormatType.DuplicateValues
format1.BackColor = Color.get_IndianRed()
# 高亮范围 H3:H16 中的唯一值
xcfs1 = sheet.ConditionalFormats.Add()
xcfs1.AddRange(sheet.Range["H3:H16"])
format2 = xcfs1.AddCondition()
format2.FormatType = ConditionalFormatType.UniqueValues
format2.BackColor = Color.get_Yellow()
workbook.Sa veToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()
if __name__ == "__main__":
HighlightDuplicateAndUnique()

这里使用了 ConditionalFormatType.DuplicateValues 和 UniqueValues,分别对应重复值和唯一值。需要注意的是,条件格式可以叠加在同一范围上,所以重复和唯一可以用不同颜色同时标记出来,非常直观。
高亮显示高于或低于平均值的数据
统计场景里,我们经常想知道哪些数据点跑偏了——高于平均或低于平均。下面的代码演示了如何为同一列数据分别用不同颜色标记:
from spire.xls import *
from spire.xls.common import *
def HighlightA verageValues():
"""高亮显示高于或低于平均值的数据"""
inputFile = "/销售报告.xlsx"
outputFile = "HighlightA verageValues.xlsx"
workbook = Workbook()
workbook.LoadFromFile(inputFile)
sheet = workbook.Worksheets[0]
# 高亮低于平均值的数据(天蓝)
format1 = sheet.ConditionalFormats.Add()
format1.AddRange(sheet.Range["E2:E10"])
cf1 = format1.AddA verageCondition(A verageType.Below)
cf1.BackColor = Color.get_SkyBlue()
# 高亮高于平均值的数据(橙色)
format2 = sheet.ConditionalFormats.Add()
format2.AddRange(sheet.Range["E2:E10"])
cf2 = format2.AddA verageCondition(A verageType.Above)
cf2.BackColor = Color.get_Orange()
workbook.Sa veToFile(outputFile, ExcelVersion.Version2010)
workbook.Dispose()
print(f"平均值高亮完成,文件已保存至: {outputFile}")
if __name__ == "__main__":
HighlightA verageValues()
通过 AddA verageCondition() 方法,配合 A verageType.Below 和 A verageType.Above,就能自动把高于/低于平均值的单元格涂上颜色。这个功能在销售数据分析、成绩对比、预算监控等场景里非常实用——一眼就能看出哪些产品“拖后腿”,哪些“领跑”。
实用技巧与高级应用
组合使用查找和条件格式化
实际项目中,往往需要把多种高亮逻辑组合起来。下面封装了一个工具类 ExcelHighlighter,把文本查找、排名高亮、重复值、平均值等功能整合在一起,方便复用:
from spire.xls import *
from spire.xls.common import *
class ExcelHighlighter:
"""Excel 高亮显示工具类"""
def __init__(self, input_file):
self.workbook = Workbook()
self.workbook.LoadFromFile(input_file)
self.input_file = input_file
def highlight_by_text(self, sheet_index, search_text,
back_color=None, case_sensitive=False,
exact_match=False):
sheet = self.workbook.Worksheets[sheet_index]
ranges = sheet.FindAllString(search_text, case_sensitive, exact_match)
if back_color is None:
back_color = Color.get_Yellow()
highlight_count = 0
for range in ranges:
range.Style.Color = back_color
highlight_count += 1
print(f"工作表 '{sheet.Name}': 高亮了 {highlight_count} 个包含 '{search_text}' 的单元格")
return highlight_count
def highlight_top_values(self, sheet_index, cell_range, top_count=5,
back_color=None):
sheet = self.workbook.Worksheets[sheet_index]
if back_color is None:
back_color = Color.get_Red()
xcfs = sheet.ConditionalFormats.Add()
xcfs.AddRange(sheet.Range[cell_range])
format_rule = xcfs.AddTopBottomCondition(TopBottomType.Top, top_count)
format_rule.FormatType = ConditionalFormatType.TopBottom
format_rule.BackColor = back_color
print(f"工作表 '{sheet.Name}': 在范围 {cell_range} 中高亮前 {top_count} 个最大值")
def highlight_bottom_values(self, sheet_index, cell_range, bottom_count=5,
back_color=None):
sheet = self.workbook.Worksheets[sheet_index]
if back_color is None:
back_color = Color.get_ForestGreen()
xcfs = sheet.ConditionalFormats.Add()
xcfs.AddRange(sheet.Range[cell_range])
format_rule = xcfs.AddTopBottomCondition(TopBottomType.Bottom, bottom_count)
format_rule.FormatType = ConditionalFormatType.TopBottom
format_rule.BackColor = back_color
print(f"工作表 '{sheet.Name}': 在范围 {cell_range} 中高亮后 {bottom_count} 个最小值")
def highlight_duplicates(self, sheet_index, cell_range,
duplicate_color=None, unique_color=None):
sheet = self.workbook.Worksheets[sheet_index]
if duplicate_color is None:
duplicate_color = Color.get_IndianRed()
if unique_color is None:
unique_color = Color.get_Yellow()
xcfs = sheet.ConditionalFormats.Add()
xcfs.AddRange(sheet.Range[cell_range])
format1 = xcfs.AddCondition()
format1.FormatType = ConditionalFormatType.DuplicateValues
format1.BackColor = duplicate_color
xcfs1 = sheet.ConditionalFormats.Add()
xcfs1.AddRange(sheet.Range[cell_range])
format2 = xcfs1.AddCondition()
format2.FormatType = ConditionalFormatType.UniqueValues
format2.BackColor = unique_color
print(f"工作表 '{sheet.Name}': 在范围 {cell_range} 中高亮重复值和唯一值")
def highlight_above_below_a verage(self, sheet_index, cell_range,
above_color=None, below_color=None):
sheet = self.workbook.Worksheets[sheet_index]
if above_color is None:
above_color = Color.get_Orange()
if below_color is None:
below_color = Color.get_SkyBlue()
format1 = sheet.ConditionalFormats.Add()
format1.AddRange(sheet.Range[cell_range])
cf1 = format1.AddA verageCondition(A verageType.Above)
cf1.BackColor = above_color
format2 = sheet.ConditionalFormats.Add()
format2.AddRange(sheet.Range[cell_range])
cf2 = format2.AddA verageCondition(A verageType.Below)
cf2.BackColor = below_color
print(f"工作表 '{sheet.Name}': 在范围 {cell_range} 中高亮高于和低于平均值的数据")
def sa ve(self, output_file=None):
if output_file is None:
output_file = self.input_file
self.workbook.Sa veToFile(output_file, ExcelVersion.Version2013)
self.workbook.Dispose()
print(f"文件已保存至: {output_file}")
def main():
input_file = "/SampleData.xlsx"
highlighter = ExcelHighlighter(input_file)
highlighter.highlight_by_text(0, "重要", Color.get_Yellow())
highlighter.highlight_top_values(0, "D2:D20", 3, Color.get_Red())
highlighter.highlight_bottom_values(0, "E2:E20", 3, Color.get_Green())
highlighter.highlight_duplicates(0, "C2:C20")
highlighter.highlight_above_below_a verage(0, "F2:F20")
highlighter.sa ve("./Output/HighlightedData.xlsx")
if __name__ == "__main__":
main()
这个工具类可以让你在一份 Excel 上同时做多种高亮,彼此互不干扰。比如查文本的同时,再跑一个排名高亮,再标一下重复值,都很顺手。
常见应用场景示例
场景 1:销售数据审查
def ReviewSalesData():
highlighter = ExcelHighlighter("./Data/SalesReport.xlsx")
# 标记所有"紧急"订单
highlighter.highlight_by_text(0, "紧急", Color.get_Orange())
# 高亮销售额前十的产品
highlighter.highlight_top_values(0, "D2:D100", 10, Color.get_LightGreen())
# 同时高亮低于平均水平的产品(浅珊瑚色)
format1 = highlighter.workbook.Worksheets[0].ConditionalFormats.Add()
format1.AddRange(highlighter.workbook.Worksheets[0].Range["D2:D100"])
cf1 = format1.AddA verageCondition(A verageType.Below)
cf1.BackColor = Color.get_LightCoral()
highlighter.sa ve("./Output/SalesReview.xlsx")
场景 2:学生成绩分析
def AnalyzeStudentGrades():
highlighter = ExcelHighlighter("./Data/StudentGrades.xlsx")
# 高亮不及格(等级为F)
highlighter.highlight_by_text(0, "F", Color.get_Red())
# 高亮前五名
highlighter.highlight_top_values(0, "C2:C50", 5, Color.get_Gold())
# 同时高亮高于和低于平均分的
highlighter.highlight_above_below_a verage(0, "C2:C50")
highlighter.sa ve("./Output/GradeAnalysis.xlsx")
场景 3:库存管理
def ManageInventory():
highlighter = ExcelHighlighter("./Data/Inventory.xlsx")
# 库存为零的标红
highlighter.highlight_by_text(0, "0", Color.get_Red())
# 库存最低的10种产品标黄
highlighter.highlight_bottom_values(0, "D2:D200", 10, Color.get_Yellow())
# 重复的产品编号也标出来
highlighter.highlight_duplicates(0, "A2:A200")
highlighter.sa ve("./Output/InventoryReview.xlsx")
最佳实践与注意事项
选择合适的高亮方法
- 静态高亮:直接设置
range.Style.Color,适合一次性操作,数据变了需要手动重新执行。 - 动态高亮:使用条件格式化,数据更新后高亮自动跟随变化,更推荐在需要持续跟踪的场景中使用。
颜色选择建议
- 警告/错误:红色或橙色系,醒目且传递紧张感。
- 成功/优秀:绿色或金色系,传递积极信息。
- 信息/中性:蓝色或黄色系,适合常规标注。
- 避免眼花缭乱:建议同一张表内不超过3~4种颜色,否则反而干扰阅读。
性能考虑
- 缩小范围:只在需要检查的单元格区域应用条件格式化,不要全表选中。
- 减少规则数量:同一个区域叠加太多条件格式化规则会拖慢 Excel 打开速度。
- 及时释放资源:操作完后调用
Dispose()方法释放内存。
常见问题与解决方案
问题 1:高亮颜色不明显
解决方案:选择对比度高的颜色,或者同时修改字体颜色(比如浅色背景配深色字体)。
问题 2:条件格式化不生效
解决方案:检查单元格范围是否写正确,确认数据类型一致(文本类型与数字类型不能混用)。
问题 3:文件体积过大
解决方案:减少条件格式化规则的数量,避免在超大范围内应用复杂规则。
总结
这次重点聊了如何用 Spire.XLS for Python 在 Excel 中实现各种查找与高亮操作。从最直接的 FindAllString() 文本定位加背景色,到条件格式化的排名、重复值、唯一值、平均值等动态高亮,都给出了完整的代码实例。最后还提供了一个可复用的工具类,方便你在实际项目中快速组装。掌握了这些方法,无论是日常的数据审查、业务分析还是质量控制,都能更高效地从数据中提取关键信息,提升工作的精准度和效率。
