京公网安备 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
在主成分分析(PCA)的学习与实践中,“主成分载荷矩阵”和“成分矩阵”是两个高频出现但极易混淆的核心概念。两者均是主成分分 ...
2026-01-07在教学管理、学生成绩分析场景中,成绩分布图是直观呈现成绩分布规律的核心工具——通过图表能快速看出成绩集中区间、高分/低分 ...
2026-01-07在数据分析师的工作闭环中,数据探索与统计分析是连接原始数据与业务洞察的关键环节。CDA(Certified Data Analyst)作为具备专 ...
2026-01-07在数据处理与可视化场景中,将Python分析后的结果导出为Excel文件是高频需求。而通过设置单元格颜色,能让Excel中的数据更具层次 ...
2026-01-06在企业运营、业务监控、数据分析等场景中,指标波动是常态——无论是日营收的突然下滑、用户活跃度的骤升,还是产品故障率的异常 ...
2026-01-06在数据驱动的建模与分析场景中,“数据决定上限,特征决定下限”已成为行业共识。原始数据经过采集、清洗后,往往难以直接支撑模 ...
2026-01-06在Python文件操作场景中,批量处理文件、遍历目录树是高频需求——无论是统计某文件夹下的文件数量、筛选特定类型文件,还是批量 ...
2026-01-05在神经网络模型训练过程中,开发者最担心的问题之一,莫过于“训练误差突然增大”——前几轮还平稳下降的损失值(Loss),突然在 ...
2026-01-05在数据驱动的业务场景中,“垃圾数据进,垃圾结果出”是永恒的警示。企业收集的数据往往存在缺失、异常、重复、格式混乱等问题, ...
2026-01-05在数字化时代,用户行为数据已成为企业的核心资产之一。从用户打开APP的首次点击,到浏览页面的停留时长,再到最终的购买决策、 ...
2026-01-04在数据分析领域,数据稳定性是衡量数据质量的核心维度之一,直接决定了分析结果的可靠性与决策价值。稳定的数据能反映事物的固有 ...
2026-01-04在CDA(Certified Data Analyst)数据分析师的工作链路中,数据读取是连接原始数据与后续分析的关键桥梁。如果说数据采集是“获 ...
2026-01-04尊敬的考生: 您好! 我们诚挚通知您,CDA Level III 考试大纲将于 2025 年 12 月 31 日实施重大更新,并正式启用,2026年3月考 ...
2025-12-31“字如其人”的传统认知,让不少“手残党”在需要签名的场景中倍感尴尬——商务签约时的签名歪歪扭扭,朋友聚会的签名墙不敢落笔 ...
2025-12-31在多元统计分析的因子分析中,“得分系数”是连接原始观测指标与潜在因子的关键纽带,其核心作用是将多个相关性较高的原始指标, ...
2025-12-31对CDA(Certified Data Analyst)数据分析师而言,高质量的数据是开展后续分析、挖掘业务价值的基础,而数据采集作为数据链路的 ...
2025-12-31在中介效应分析(或路径分析)中,间接效应是衡量“自变量通过中介变量影响因变量”这一间接路径强度与方向的核心指标。不同于直 ...
2025-12-30数据透视表是数据分析中高效汇总、多维度分析数据的核心工具,能快速将杂乱数据转化为结构化的汇总报表。在实际分析场景中,我们 ...
2025-12-30在金融投资、商业运营、用户增长等数据密集型领域,量化策略凭借“数据驱动、逻辑可验证、执行标准化”的优势,成为企业提升决策 ...
2025-12-30CDA(Certified Data Analyst),是在数字经济大背景和人工智能时代趋势下,源自中国,走向世界,面向全行业的专业技能认证,旨 ...
2025-12-29