京公网安备 11010802034615号
经营许可证编号:京B2-20210330
在数据处理与可视化场景中,将Python分析后的结果导出为Excel文件是高频需求。而通过设置单元格颜色,能让Excel中的数据更具层次感——比如用红色标记异常值、绿色突出达标数据、黄色标注重点信息,极大提升数据可读性。Python中主流的Excel操作库(如openpyxl、xlsxwriter、pandas)均支持导出Excel时设置颜色,不同库的实现逻辑与适用场景各有差异。本文将系统拆解Python to_excel设置颜色的核心方法,结合多个实战案例,帮助读者快速掌握各类场景下的颜色设置技巧。
在Python中通过to_excel设置颜色,本质是借助Excel操作库定义“单元格样式”(包含字体颜色、填充颜色、边框等属性),再将样式应用到指定单元格或单元格区域,最终通过导出方法写入Excel文件。
关键前提与核心概念:
支持格式:仅.xlsx格式支持颜色设置,.xls格式因兼容性问题无法实现;
颜色表示方式:常用两种形式——① 十六进制颜色码(如"#FF0000"表示红色、"#00FF00"表示绿色);② RGB值(如(255,0,0)对应红色);部分库还支持颜色名称(如"red"、"green"),但兼容性较差,不推荐使用;
核心操作流程:创建工作簿→定义单元格样式(含颜色属性)→写入数据并应用样式→保存/导出文件。
工具选型建议:若需创建新Excel并设置复杂颜色样式,优先使用xlsxwriter;若需修改现有Excel的颜色属性,优先使用openpyxl;若基于pandas.DataFrame导出,可结合pandas的Style类或指定engine(openpyxl/xlsxwriter)实现颜色设置。
以下分别介绍xlsxwriter、openpyxl、pandas三种主流工具的颜色设置方法,涵盖“创建样式→应用样式→导出文件”全流程,附完整可运行代码。
xlsxwriter是专门用于创建.xlsx文件的库,支持丰富的单元格样式设置,API简洁直观,适合从零开始构建带颜色的Excel文件。
安装库:pip install xlsxwriter
核心逻辑:创建工作簿→添加工作表→定义样式(指定字体颜色、填充颜色)→写入数据时应用样式→关闭工作簿。
import xlsxwriter
# 1. 创建工作簿(可直接指定导出路径)
workbook = xlsxwriter.Workbook("xlsxwriter_color_demo.xlsx")
# 2. 添加工作表
worksheet = workbook.add_worksheet("数据报表")
# 3. 定义不同颜色样式
# 样式1:红色字体+黄色填充(标注异常值)
style_error = workbook.add_format({
'font_color': '#FF0000', # 字体颜色:红色
'bg_color': '#FFFF00', # 填充颜色:黄色
'align': 'center', # 居中对齐(可选,提升可读性)
'border': 1 # 边框(可选)
})
# 样式2:绿色字体+浅绿色填充(标注达标值)
style_ok = workbook.add_format({
'font_color': '#008000',
'bg_color': '#90EE90',
'align': 'center',
'border': 1
})
# 样式3:蓝色字体+无填充(标注标题)
style_title = workbook.add_format({
'font_color': '#0000FF',
'bold': True, # 加粗(可选)
'align': 'center',
'border': 1
})
# 4. 写入数据并应用样式
# 写入标题(应用标题样式)
worksheet.write('A1', '产品名称', style_title)
worksheet.write('B1', '销量', style_title)
worksheet.write('C1', '是否达标', style_title)
# 写入数据(根据条件应用不同样式)
data = [
['产品A', 120, '达标'],
['产品B', 80, '不达标'],
['产品C', 150, '达标'],
['产品D', 60, '不达标']
]
for row_idx, row_data in enumerate(data, start=1):
worksheet.write(row_idx, 0, row_data[0], style_title) # 产品名称应用标题样式
# 销量根据数值大小设置样式(<100为异常值)
if row_data[1] < 100:
worksheet.write(row_idx, 1, row_data[1], style_error)
else:
worksheet.write(row_idx, 1, row_data[1], style_ok)
# 是否达标根据内容设置样式
if row_data[2] == '达标':
worksheet.write(row_idx, 2, row_data[2], style_ok)
else:
worksheet.write(row_idx, 2, row_data[2], style_error)
# 5. 关闭工作簿(自动保存文件)
workbook.close()
print("Excel文件已生成,颜色设置完成!")
xlsxwriter的add_format()方法用于创建样式,支持多种属性(字体颜色、填充颜色、对齐方式、边框等);
通过write()方法写入数据时,将样式作为第三个参数传入,即可应用到对应单元格;
支持批量应用样式:若需对某一区域(如整列、整行)应用样式,可使用set_column()(设置列样式)或set_row()(设置行样式),例如worksheet.set_column('A:C', 15, style_title)(将A-C列设置为标题样式,列宽15)。
openpyxl支持读取现有.xlsx文件并修改其内容与样式,适合在已有Excel模板的基础上设置颜色(如在数据报表模板中填充数据并标记颜色)。
安装库:pip install openpyxl
核心逻辑:加载现有工作簿→获取工作表→定义样式→修改单元格数据并应用样式→保存文件。
from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment
# 1. 加载现有Excel文件(若需创建新文件,使用Workbook())
wb = load_workbook("existing_excel.xlsx")
# 2. 获取工作表(通过工作表名称)
ws = wb["数据报表"]
# 3. 定义颜色样式
# 字体样式:红色字体
font_red = Font(color="#FF0000", bold=True)
# 填充样式:黄色填充
fill_yellow = PatternFill(start_color="#FFFF00", end_color="#FFFF00", fill_type="solid")
# 组合样式:绿色字体+浅绿色填充(需通过单元格的font、fill属性分别设置)
font_green = Font(color="#008000")
fill_green_light = PatternFill(start_color="#90EE90", end_color="#90EE90", fill_type="solid")
# 边框样式(可选,提升美观度)
border = Border(
left=Side(style='thin'),
right=Side(style='thin'),
top=Side(style='thin'),
bottom=Side(style='thin')
)
# 对齐样式(可选)
align_center = Alignment(horizontal='center', vertical='center')
# 4. 应用样式到单元格
# 场景1:标记A2单元格为异常值(红色字体+黄色填充)
ws['A2'].font = font_red
ws['A2'].fill = fill_yellow
ws['A2'].border = border
ws['A2'].alignment = align_center
# 场景2:批量标记B列达标数据(销量>=100)
for row in range(2, ws.max_row + 1): # 从第2行开始(跳过标题行)
sales = ws[f'B{row}'].value
if sales and sales >= 100:
ws[f'B{row}'].font = font_green
ws[f'B{row}'].fill = fill_green_light
ws[f'B{row}'].border = border
ws[f'B{row}'].alignment = align_center
# 5. 保存文件(若需另存为新文件,修改文件名)
wb.save("modified_excel_with_color.xlsx")
print("Excel文件修改完成,颜色设置已应用!")
openpyxl通过Font()(字体样式)、PatternFill()(填充样式)分别定义颜色,需通过单元格的font、fill属性单独赋值;
PatternFill的fill_type="solid"表示实心填充,缺少此参数将无法显示填充颜色;
读取现有Excel时,需确保文件为.xlsx格式,且未被其他程序占用(否则会报错)。
若日常工作以pandas处理数据为主,可直接使用pandas的Style类设置颜色,无需单独调用xlsxwriter或openpyxl,适合快速实现“条件格式化”(如按数值范围着色)。
安装库:pandas默认已集成相关功能,若需导出Excel,需确保安装openpyxl或xlsxwriter(pip install pandas openpyxl);
核心逻辑:创建DataFrame→使用Style类的条件格式化方法设置颜色→导出为Excel文件。
import pandas as pd
# 1. 创建示例DataFrame
data = {
'产品名称': ['产品A', '产品B', '产品C', '产品D', '产品E'],
'销量': [120, 80, 150, 60, 110],
'利润率': [0.25, 0.12, 0.32, 0.08, 0.28]
}
df = pd.DataFrame(data)
# 2. 使用Style设置颜色(条件格式化)
def color_sales(val):
"""自定义函数:销量<100标记为红色,否则为绿色"""
color = '#FF0000' if val < 100 else '#008000'
return f'color: {color}; text-align: center; border: 1px solid #000000'
def color_profit(val):
"""自定义函数:利润率>0.2标记为浅绿色填充,否则无填充"""
if val > 0.2:
return 'background-color: #90EE90; text-align: center; border: 1px solid #000000'
else:
return 'text-align: center; border: 1px solid #000000'
# 应用样式:销量列应用color_sales,利润率列应用color_profit
styled_df = df.style.applymap(
color_sales, subset=['销量'] # subset指定应用列
).applymap(
color_profit, subset=['利润率']
).set_table_styles([
# 设置标题行样式
{'selector': 'thead th', 'props': [
('font-color', '#0000FF'),
('background-color', '#F0F8FF'),
('text-align', 'center'),
('border', '1px solid #000000')
]}
])
# 3. 导出为Excel文件(需指定engine,否则可能无法显示样式)
styled_df.to_excel(
"pandas_style_color.xlsx",
engine='openpyxl', # 或'xlsxwriter'
index=False, # 不导出索引列
sheet_name='销量利润报表'
)
print("DataFrame导出Excel完成,颜色样式已应用!")
pandas Style的applymap()方法用于对单元格逐个应用样式,需传入自定义函数(参数为单元格值,返回CSS样式字符串);
subset参数用于指定应用样式的列或行,避免全局应用;
导出时必须指定engine='openpyxl'或engine='xlsxwriter',否则样式无法正常显示;
除自定义函数外,pandas还提供内置条件格式化方法,如background_gradient()(渐变颜色)、highlight_max()(高亮最大值)、highlight_min()(高亮最小值),简化常用场景的操作。
以下针对“批量标记异常值”“按数值区间着色”“动态生成颜色样式”三个高频复杂场景,提供进阶实战案例,覆盖实际工作中的核心需求。
需求:对DataFrame中的数值列,通过3σ原则识别异常值(超出均值±3倍标准差),并用红色填充标记。
import pandas as pd
import numpy as np
# 1. 生成含异常值的示例数据
np.random.seed(42)
data = {
'数值列1': np.random.normal(loc=50, scale=10, size=100), # 均值50,标准差10
'数值列2': np.random.normal(loc=100, scale=20, size=100) # 均值100,标准差20
}
df = pd.DataFrame(data)
# 2. 定义异常值识别与颜色设置函数
def highlight_outliers(s):
"""基于3σ原则识别异常值,标记为红色填充"""
mean = s.mean()
std = s.std()
lower_bound = mean - 3 * std
upper_bound = mean + 3 * std
# 异常值标记为红色填充,正常值无填充
return ['background-color: #FF0000' if (x < lower_bound or x > upper_bound) else '' for x in s]
# 3. 应用样式并导出
styled_df = df.style.apply(
highlight_outliers, # 注意:数值列用apply(),而非applymap()
subset=['数值列1', '数值列2']
).set_table_styles([
{'selector': 'thead th', 'props': [('text-align', 'center'), ('border', '1px solid #000')]},
{'selector': 'tbody td', 'props': [('text-align', 'center'), ('border', '1px solid #000')]}
])
styled_df.to_excel("outliers_highlight.xlsx", engine='openpyxl', index=False)
print("异常值标记完成,已导出Excel文件!")
需求:对销量列按数值区间设置渐变颜色(0-50:浅红色,50-100:浅黄色,100-150:浅绿色,150以上:浅蓝色),直观呈现数据分布。
import pandas as pd
# 1. 创建示例数据
df = pd.DataFrame({
'产品': [f'产品{i}' for i in range(1, 21)],
'销量': [35, 62, 120, 180, 45, 98, 135, 76, 105, 20, 156, 88, 55, 112, 168, 70, 92, 140, 68, 125]
})
# 2. 定义按区间着色的函数
def color_by_range(val):
if val <= 50:
return 'background-color: #FFE4E1' # 浅红色
elif val <= 100:
return 'background-color: #FFFFE0' # 浅黄色
elif val <= 150:
return 'background-color: #F0FFF0' # 浅绿色
else:
return 'background-color: #E6F3FF' # 浅蓝色
# 3. 应用样式并导出
styled_df = df.style.applymap(
color_by_range, subset=['销量']
).applymap(
lambda x: 'text-align: center; border: 1px solid #000', # 所有单元格居中+边框
subset=['产品', '销量']
).set_table_styles([
{'selector': 'thead th', 'props': [('background-color', '#F0F8FF'), ('font-weight', 'bold')]}
])
styled_df.to_excel("gradient_color_by_range.xlsx", engine='openpyxl', index=False)
print("按区间渐变颜色设置完成!")
需求:根据产品所属类别,动态分配不同颜色(如电子类:蓝色,服装类:粉色,食品类:橙色),实现多维度数据的视觉区分。
import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import PatternFill
# 1. 创建含多类别数据
df = pd.DataFrame({
'产品名称': ['手机', 'T恤', '面包', '电脑', '牛仔裤', '牛奶', '耳机', '连衣裙', '蛋糕'],
'类别': ['电子', '服装', '食品', '电子', '服装', '食品', '电子', '服装', '食品'],
'销量': [150, 80, 120, 90, 110, 130, 70, 60, 140]
})
# 2. 定义类别-颜色映射(动态配置)
category_color_map = {
'电子': '#87CEEB', # 浅蓝色
'服装': '#FFC0CB', # 粉色
'食品': '#FFA500' # 橙色
}
# 3. 使用openpyxl动态应用颜色
wb = Workbook()
ws = wb.active
ws.title = "多类别产品报表"
# 写入标题
headers = df.columns.tolist()
for col_idx, header in enumerate(headers, start=1):
cell = ws.cell(row=1, column=col_idx, value=header)
# 标题样式
cell.fill = PatternFill(start_color='#F0F8FF', end_color='#F0F8FF', fill_type='solid')
# 写入数据并动态应用颜色
for row_idx, (_, row) in enumerate(df.iterrows(), start=2):
for col_idx, value in enumerate(row, start=1):
cell = ws.cell(row=row_idx, column=col_idx, value=value)
# 对类别列及对应行应用颜色
if col_idx == 2: # 类别列
color = category_color_map.get(value, '#FFFFFF') # 默认为白色
cell.fill = PatternFill(start_color=color, end_color=color, fill_type='solid')
# 同一行的其他列也应用相同颜色(浅化处理,避免过于刺眼)
light_color = color + '80' # 透明度80%
for col in range(1, len(headers) + 1):
ws.cell(row=row_idx, column=col).fill = PatternFill(start_color=light_color, end_color=light_color, fill_type='solid')
# 保存文件
wb.save("dynamic_category_color.xlsx")
print("动态类别颜色设置完成!")
在实际操作中,以下细节若未注意,容易导致颜色设置失效或出现异常,需重点规避:
仅.xlsx格式支持颜色设置,若导出为.xls格式(如指定engine='xlwt'),所有颜色样式都会失效。解决方案:统一使用.xlsx格式,导出时不指定或指定正确的engine(openpyxl/xlsxwriter)。
不同库对颜色表示的支持存在差异:xlsxwriter支持颜色名称(如"red"),但openpyxl对颜色名称的支持有限;建议统一使用十六进制颜色码,兼容性最佳。
使用pandas Style导出时,若未指定engine,或同时安装了多个Excel引擎,可能导致样式无法显示。解决方案:明确指定engine='openpyxl'或engine='xlsxwriter',并确保对应引擎已安装。
当数据量较大(如10万行以上)时,使用openpyxl逐 cell 设置样式会导致性能极差(耗时过长)。解决方案:优先使用xlsxwriter(性能更优),或通过批量样式设置方法(如xlsxwriter的set_column/set_row)替代逐 cell 操作。
使用openpyxl加载现有Excel并修改样式时,会覆盖原有单元格的样式(如字体、对齐方式)。解决方案:修改前先读取原有样式,再在原有样式基础上添加颜色属性,避免完全覆盖。
Python to_excel设置颜色的核心是“选对工具+掌握样式定义逻辑”:创建新Excel且需复杂样式,选xlsxwriter;修改现有Excel或需精细控制样式,选openpyxl;基于pandas DataFrame快速导出,选pandas Style+指定引擎。三者的核心逻辑一致——都是“定义样式→应用样式→导出保存”,只是API与适用场景不同。
学习建议:
新手入门:先掌握xlsxwriter的基础用法(API简洁,容易上手),快速实现颜色设置需求;
进阶提升:学习openpyxl的样式精细控制,适配修改现有Excel的场景;
高效办公:熟练使用pandas Style的条件格式化方法,结合实际业务场景编写自定义着色函数,提升数据处理与可视化效率。
通过本文的方法与案例,相信读者能快速掌握Python to_excel设置颜色的核心技巧,让导出的Excel文件更具可读性与专业性,助力数据沟通与决策效率的提升。

数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
在数据清洗、统计分析与数据质量检测工作中,箱型图(又称箱线图、Box Plot)是最直观、最高效的可视化分析工具之一。相较于柱状 ...
2026-05-25在大数据分析、数据清洗、质量管控、风险监测等领域,异常数据识别是保障数据质量、确保分析结论精准、规避业务决策失误的核心基 ...
2026-05-25 很多数据分析师精通Excel函数和透视表,但当被问到“数据从哪里来”“表和视图有什么区别”“数据库管理系统和SQL是什么关系 ...
2026-05-25数字化经营时代,企业的市场竞争早已从经验决策转向数据决策。门店营收、用户转化、产品销量、成本损耗、存量资产等所有经营行为 ...
2026-05-22在MySQL数据库日常运维、业务数据校验、数据迁移与数据清洗场景中,自增主键ID的连续性校验是一项基础且关键的工作。MySQL的Auto ...
2026-05-22 很多企业团队并非缺乏指标,而是陷入“指标失控”:仪表盘上堆满实时跳动的数据,却无法回答“当前瓶颈在哪、下一步该做什么 ...
2026-05-22【核心关键词】大数据、可视化、存储、架构、客户、离线、产品、同步、实时、数据仓库、数据分析、数据可视化、存储数据、离线 ...
2026-05-21在电商流量红利消退、公域获客成本持续走高的当下,存量用户深度挖掘已成为店铺增收增效的核心抓手。相较于付费投放获取的陌生新 ...
2026-05-21 很多数据分析师每天盯着几十个指标,但当被问到“这套指标要支撑什么业务目标”“指标之间是什么逻辑关系”“业务变化时如何 ...
2026-05-21在数据驱动决策的时代,数据质量直接决定分析结果的可靠性与准确性,而异常值作为数据清洗中的核心痛点,往往会扭曲分析结论、误 ...
2026-05-20 很多数据分析师每天盯着GMV、DAU、转化率,但当被问到“哪些指标在所有行业都适用”“哪些指标只对电商有意义”“二者如何搭 ...
2026-05-20Agent的能力边界,很大程度上取决于其掌握的Skill质量和数量。传统做法是靠人工编写和维护Skill,但这条路很快会遇到瓶颈。业务 ...
2026-05-20在统计分析中,方差分析(ANOVA)是一种常用的假设检验方法,核心用于分析“一个或多个自变量对单个因变量的影响”,广泛应用于 ...
2026-05-19 很多数据分析师每天盯着GMV、DAU、转化率,但当被问到“什么是指标”“指标和维度有什么区别”“如何定义指标值的计算规则和 ...
2026-05-19想高效备考 CDA 一级,拒绝盲目刷题、冗余学习?《CDA 一级教材知识手册》重磅来袭!以官方教材为核心,浓缩 13 章 103 个核心考 ...
2026-05-19在数据统计分析中,卡方检验是一种常用的非参数检验方法,核心用于判断两个或多个分类变量之间是否存在显著关联,广泛应用于市场 ...
2026-05-18在企业数字化转型的浪潮中,很多企业陷入了“技术堆砌”的误区——上线了ERP、CRM、BI等各类系统,积累了海量数据,却依然面临“ ...
2026-05-18小陈是某电商平台的数据分析师。老板交给他一个任务:“我们平台的注册用户已经突破1000万了,想了解一下用户的平均月消费金额。 ...
2026-05-18【专访摘要】本次CDA持证专访邀请到拥有丰富物流供应链数据分析经验的赖尧,他结合自身在京东、华莱士、兰格赛等企业的从业经历 ...
2026-05-15在数字化时代,企业的每一次业务优化、每一项技术迭代,都需要回答一个核心问题:这个动作到底能带来多少价值?是提升了用户转化 ...
2026-05-15