热线电话:13121318867

登录
首页大数据时代【CDA干货】Python to_excel设置颜色完全指南:从基础到实战
【CDA干货】Python to_excel设置颜色完全指南:从基础到实战
2026-01-06
收藏

数据处理与可视化场景中,将Python分析后的结果导出为Excel文件是高频需求。而通过设置单元格颜色,能让Excel中的数据更具层次感——比如用红色标记异常值、绿色突出达标数据、黄色标注重点信息,极大提升数据可读性。Python中主流的Excel操作库(如openpyxl、xlsxwriter、pandas)均支持导出Excel时设置颜色,不同库的实现逻辑与适用场景各有差异。本文将系统拆解Python to_excel设置颜色的核心方法,结合多个实战案例,帮助读者快速掌握各类场景下的颜色设置技巧。

一、核心认知:Python操作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三种主流工具的颜色设置方法,涵盖“创建样式→应用样式→导出文件”全流程,附完整可运行代码。

方法1:xlsxwriter——创建新Excel的颜色设置首选

xlsxwriter是专门用于创建.xlsx文件的库,支持丰富的单元格样式设置,API简洁直观,适合从零开始构建带颜色的Excel文件。

核心步骤与代码示例

  1. 安装库:pip install xlsxwriter

  2. 核心逻辑:创建工作簿→添加工作表→定义样式(指定字体颜色、填充颜色)→写入数据时应用样式→关闭工作簿。


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)。

方法2:openpyxl——修改现有Excel的颜色设置首选

openpyxl支持读取现有.xlsx文件并修改其内容与样式,适合在已有Excel模板的基础上设置颜色(如在数据报表模板中填充数据并标记颜色)。

核心步骤与代码示例

  1. 安装库:pip install openpyxl

  2. 核心逻辑:加载现有工作簿→获取工作表→定义样式→修改单元格数据并应用样式→保存文件。


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()(填充样式)分别定义颜色,需通过单元格的fontfill属性单独赋值;

  • PatternFill的fill_type="solid"表示实心填充,缺少此参数将无法显示填充颜色;

  • 读取现有Excel时,需确保文件为.xlsx格式,且未被其他程序占用(否则会报错)。

方法3:pandas Style——DataFrame导出Excel的快速颜色设置

若日常工作以pandas处理数据为主,可直接使用pandasStyle类设置颜色,无需单独调用xlsxwriter或openpyxl,适合快速实现“条件格式化”(如按数值范围着色)。

核心步骤与代码示例

  1. 安装库:pandas默认已集成相关功能,若需导出Excel,需确保安装openpyxl或xlsxwriter(pip install pandas openpyxl);

  2. 核心逻辑:创建DataFrame→使用Style类的条件格式化方法设置颜色→导出为Excel文件。


import pandas as pd

# 1. 创建示例DataFrame
data = {
    '产品名称': ['产品A''产品B''产品C''产品D''产品E'],
    '销量': [1208015060110],
    '利润率': [0.250.120.320.080.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()(高亮最小值),简化常用场景的操作。

三、实战进阶:复杂场景的颜色设置技巧

以下针对“批量标记异常值”“按数值区间着色”“动态生成颜色样式”三个高频复杂场景,提供进阶实战案例,覆盖实际工作中的核心需求。

场景1:批量标记DataFrame中的异常值(基于3σ原则)

需求:对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文件!")

场景2:按数值区间设置渐变颜色(提升数据层次感)

需求:对销量列按数值区间设置渐变颜色(0-50:浅红色,50-100:浅黄色,100-150:浅绿色,150以上:浅蓝色),直观呈现数据分布。


import pandas as pd

# 1. 创建示例数据
df = pd.DataFrame({
    '产品': [f'产品{i}' for i in range(121)],
    '销量': [3562120180459813576105201568855112168709214068125]
})

# 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("按区间渐变颜色设置完成!")

场景3:动态生成颜色样式(适配多维度数据标记)

需求:根据产品所属类别,动态分配不同颜色(如电子类:蓝色,服装类:粉色,食品类:橙色),实现多维度数据的视觉区分。


import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import PatternFill

# 1. 创建含多类别数据
df = pd.DataFrame({
    '产品名称': ['手机''T恤''面包''电脑''牛仔裤''牛奶''耳机''连衣裙''蛋糕'],
    '类别': ['电子''服装''食品''电子''服装''食品''电子''服装''食品'],
    '销量': [15080120901101307060140]
})

# 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("动态类别颜色设置完成!")

四、注意事项:规避Python to_excel设置颜色的常见坑

在实际操作中,以下细节若未注意,容易导致颜色设置失效或出现异常,需重点规避:

1. 格式兼容性问题

仅.xlsx格式支持颜色设置,若导出为.xls格式(如指定engine='xlwt'),所有颜色样式都会失效。解决方案:统一使用.xlsx格式,导出时不指定或指定正确的engine(openpyxl/xlsxwriter)。

2. 颜色表示方式的兼容性

不同库对颜色表示的支持存在差异:xlsxwriter支持颜色名称(如"red"),但openpyxl对颜色名称的支持有限;建议统一使用十六进制颜色码,兼容性最佳。

3. pandas Style导出的样式显示问题

使用pandas Style导出时,若未指定engine,或同时安装了多个Excel引擎,可能导致样式无法显示。解决方案:明确指定engine='openpyxl'或engine='xlsxwriter',并确保对应引擎已安装。

4. 大量数据的性能问题

当数据量较大(如10万行以上)时,使用openpyxl逐 cell 设置样式会导致性能极差(耗时过长)。解决方案:优先使用xlsxwriter(性能更优),或通过批量样式设置方法(如xlsxwriter的set_column/set_row)替代逐 cell 操作。

5. 现有Excel文件的样式覆盖问题

使用openpyxl加载现有Excel并修改样式时,会覆盖原有单元格的样式(如字体、对齐方式)。解决方案:修改前先读取原有样式,再在原有样式基础上添加颜色属性,避免完全覆盖。

五、总结:Python to_excel设置颜色的核心选型与学习建议

Python to_excel设置颜色的核心是“选对工具+掌握样式定义逻辑”:创建新Excel且需复杂样式,选xlsxwriter;修改现有Excel或需精细控制样式,选openpyxl;基于pandas DataFrame快速导出,选pandas Style+指定引擎。三者的核心逻辑一致——都是“定义样式→应用样式→导出保存”,只是API与适用场景不同。

学习建议:

  • 新手入门:先掌握xlsxwriter的基础用法(API简洁,容易上手),快速实现颜色设置需求;

  • 进阶提升:学习openpyxl的样式精细控制,适配修改现有Excel的场景;

  • 高效办公:熟练使用pandas Style的条件格式化方法,结合实际业务场景编写自定义着色函数,提升数据处理与可视化效率。

通过本文的方法与案例,相信读者能快速掌握Python to_excel设置颜色的核心技巧,让导出的Excel文件更具可读性与专业性,助力数据沟通与决策效率的提升。

推荐学习书籍 《CDA一级教材》适合CDA一级考生备考,也适合业务及数据分析岗位的从业者提升自我。完整电子版已上线CDA网校,累计已有10万+在读~ !

免费加入阅读:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

数据分析咨询请扫描二维码

若不方便扫码,搜微信号:CDAshujufenxi

数据分析师资讯
更多

OK
客服在线
立即咨询
客服在线
立即咨询