《使用Python绘制报表设置单元格颜色的实例代码》
在数据分析和办公自动化场景中,使用Python生成带有颜色标记的Excel报表是常见需求。通过Python的第三方库(如openpyxl、xlsxwriter或pandas)可以高效实现这一功能。本文将详细介绍三种主流库的设置单元格颜色方法,并对比其适用场景。
一、openpyxl库实现单元格着色
openpyxl是操作.xlsx格式文件的常用库,支持单元格样式设置。其核心步骤包括:创建工作簿、选择工作表、设置单元格值、应用颜色样式。
1. 基础颜色设置
from openpyxl import Workbook
from openpyxl.styles import PatternFill
# 创建工作簿
wb = Workbook()
ws = wb.active
# 设置单元格值
ws['A1'] = "销售额"
ws['B1'] = 12500
# 创建填充样式(红色背景)
red_fill = PatternFill(start_color="FFFF0000", end_color="FFFF0000", fill_type="solid")
ws['B1'].fill = red_fill # 应用到B1单元格
wb.save("sales_report.xlsx")
代码说明:PatternFill对象通过start_color和end_color参数定义颜色(十六进制格式),fill_type="solid"表示纯色填充。颜色值需去掉#号前缀。
2. 条件格式实现
当需要根据数据值动态着色时,可使用ConditionalFormatting:
from openpyxl.formatting.rule import CellIsRule
from openpyxl.styles import Font, PatternFill
wb = Workbook()
ws = wb.active
# 填充测试数据
for i in range(1, 11):
ws[f'A{i}'] = i*1000
# 创建条件格式规则(大于5000显示绿色)
green_fill = PatternFill(start_color="FF00FF00", end_color="FF00FF00")
rule = CellIsRule(operator='greaterThan', formula=['5000'], fill=green_fill)
# 应用到A列
ws.conditional_formatting.add('A1:A10', rule)
wb.save("conditional_report.xlsx")
关键点:CellIsRule支持多种比较运算符(>,
3. 渐变颜色设置
openpyxl支持通过GradientFill实现渐变效果:
from openpyxl.styles import GradientFill
wb = Workbook()
ws = wb.active
ws['A1'] = "渐变示例"
# 创建双色渐变(红到黄)
gradient = GradientFill(stop=("FF0000", "FFFF00"))
ws['A1'].fill = gradient
wb.save("gradient_report.xlsx")
二、xlsxwriter库的高级着色功能
xlsxwriter在生成大型报表时性能更优,支持更丰富的格式选项。其着色方式分为直接设置和格式对象两种。
1. 直接单元格着色
import xlsxwriter
# 创建工作簿
workbook = xlsxwriter.Workbook('direct_color.xlsx')
worksheet = workbook.add_worksheet()
# 定义颜色格式(蓝色背景)
blue_format = workbook.add_format({'bg_color': '#0000FF'})
# 写入数据并应用格式
worksheet.write('A1', '蓝色单元格', blue_format)
workbook.close()
注意:xlsxwriter使用完整的十六进制颜色码(包含#号),且需通过add_format()预先创建格式对象。
2. 条件格式进阶
该库支持数据条、色阶等Excel高级功能:
workbook = xlsxwriter.Workbook('advanced_format.xlsx')
worksheet = workbook.add_worksheet()
# 填充数据
for i in range(10):
worksheet.write(i, 0, i*500)
# 创建数据条格式(绿色渐变条)
data_bar = workbook.add_format({
'bg_color': '#C6EFCE',
'bar_color': '#63BE7B'
})
# 应用到A1:A10
worksheet.conditional_format('A1:A10', {
'type': 'data_bar',
'data_bar': data_bar
})
workbook.close()
扩展功能:支持图标集(如箭头、星级)、突出显示重复值等复杂条件格式。
3. 跨单元格合并着色
workbook = xlsxwriter.Workbook('merge_color.xlsx')
worksheet = workbook.add_worksheet()
# 合并单元格并设置格式
merge_format = workbook.add_format({
'bold': True,
'font_color': 'white',
'bg_color': '#4472C4',
'align': 'center'
})
worksheet.merge_range('A1:D1', '合并标题', merge_format)
workbook.close()
三、pandas与ExcelWriter的集成方案
当使用pandas处理数据时,可通过ExcelWriter无缝衔接着色功能。
1. 基础表格着色
import pandas as pd
# 创建DataFrame
df = pd.DataFrame({
'产品': ['A', 'B', 'C'],
'销量': [120, 85, 200]
})
# 创建ExcelWriter对象
writer = pd.ExcelWriter('pandas_color.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='销售', index=False)
# 获取工作簿和工作表对象
workbook = writer.book
worksheet = writer.sheets['销售']
# 定义格式
highlight = workbook.add_format({'bg_color': '#FFC7CE'})
# 应用到销量>100的单元格
for row in range(2, len(df)+2): # 跳过标题行
if df.iloc[row-2, 1] > 100:
worksheet.write(row, 1, df.iloc[row-2, 1], highlight)
writer.close()
2. 整列着色优化
对于大数据量,建议使用条件格式而非逐个单元格设置:
writer = pd.ExcelWriter('optimized_color.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='优化', index=False)
workbook = writer.book
worksheet = writer.sheets['优化']
# 创建条件格式规则
format1 = workbook.add_format({'bg_color': '#FFEB9C'})
worksheet.conditional_format('B2:B4', {
'type': 'cell',
'criteria': '>=',
'value': 100,
'format': format1
})
writer.close()
3. 多表样式统一管理
# 创建多个DataFrame
df1 = pd.DataFrame({'区域': ['东', '西'], '利润': [45, 32]})
df2 = pd.DataFrame({'月份': ['1月', '2月'], '收入': [78, 92]})
# 定义公共格式
header_format = pd.ExcelWriter.book.add_format({
'bold': True,
'bg_color': '#D9E1F2'
}) # 需在ExcelWriter创建后获取book对象
# 正确写法(分步实现)
with pd.ExcelWriter('multi_sheet.xlsx', engine='xlsxwriter') as writer:
book = writer.book
header_fmt = book.add_format({'bold': True, 'bg_color': '#D9E1F2'})
df1.to_excel(writer, sheet_name='区域', index=False)
worksheet1 = writer.sheets['区域']
worksheet1.set_row(0, None, header_fmt) # 应用到标题行
df2.to_excel(writer, sheet_name='月份', index=False)
worksheet2 = writer.sheets['月份']
worksheet2.set_row(0, None, header_fmt)
四、性能优化与最佳实践
1. 大数据量处理建议:
- 优先使用xlsxwriter的conditional_format替代循环设置
- 批量操作时关闭屏幕更新(xlsxwriter无此选项,openpyxl可考虑使用只读模式)
- 避免在循环中频繁创建Format对象
2. 颜色选择原则:
- 遵循WCAG 2.0对比度标准(文本与背景对比度≥4.5:1)
- 使用色盲友好配色方案(如蓝橙对比)
- 限制单表颜色种类(建议不超过5种)
3. 跨平台兼容性:
- openpyxl适合修改现有文件
- xlsxwriter生成新文件性能更优
- pandas集成方案适合数据分析流程
五、完整案例:销售数据分析报表
import pandas as pd
import xlsxwriter
# 模拟数据
data = {
'产品': ['手机', '笔记本', '平板', '耳机'],
'Q1销量': [1200, 850, 620, 1500],
'Q2销量': [1350, 920, 710, 1620],
'增长率': [12.5, 8.2, 14.5, 8.0]
}
df = pd.DataFrame(data)
# 创建Excel文件
with pd.ExcelWriter('sales_analysis.xlsx', engine='xlsxwriter') as writer:
# 写入数据
df.to_excel(writer, sheet_name='季度分析', index=False)
# 获取工作簿和工作表
workbook = writer.book
worksheet = writer.sheets['季度分析']
# 定义格式
header_fmt = workbook.add_format({
'bold': True,
'bg_color': '#4472C4',
'font_color': 'white',
'align': 'center',
'valign': 'vcenter'
})
growth_high = workbook.add_format({
'bg_color': '#C6EFCE',
'font_color': '#006100'
})
growth_low = workbook.add_format({
'bg_color': '#FFC7CE',
'font_color': '#9C0006'
})
# 应用标题格式
worksheet.set_row(0, None, header_fmt)
# 设置增长率列条件格式
for row in range(1, len(df)+1):
growth = df.iloc[row-1, 4]
if growth > 10:
worksheet.write(row, 4, growth, growth_high)
else:
worksheet.write(row, 4, growth, growth_low)
# 添加数据条到Q2销量列
data_bar = workbook.add_format({
'bg_color': '#F8CBAD',
'bar_color': '#C00000'
})
worksheet.conditional_format(
'D2:D5',
{'type': 'data_bar', 'data_bar': data_bar}
)
关键词:Python报表生成、单元格着色、openpyxl、xlsxwriter、pandas集成、条件格式、Excel自动化、数据可视化
简介:本文系统介绍了使用Python生成带颜色标记Excel报表的三种主流方案(openpyxl、xlsxwriter、pandas),涵盖基础单元格着色、条件格式、渐变效果、跨表样式管理等核心功能,提供完整代码示例和性能优化建议,适用于数据分析、财务报告、运营看板等业务场景。