当前位置:首页>python>Day17:表格“美颜术”!用Python给Excel加颜色、数据条、图标集

Day17:表格“美颜术”!用Python给Excel加颜色、数据条、图标集

  • 2026-09-21 12:29:29
Day17:表格“美颜术”!用Python给Excel加颜色、数据条、图标集

领导说表格太单调?Python三行代码让数据自动“亮”起来!

一、先看这个真实场景

刘会计每个月都要做这件事:

  1. 从系统导出费用明细表(几千行)
  2. 要标记出超预算的项目(红色背景)
  3. 要标出优秀的部门(绿色字体)
  4. 最好能有数据条,一眼看出金额大小

以前她用Excel:

  1. 选中数据 → 条件格式 → 新建规则 ✓
  2. 设置公式 → 选颜色 → 确定 ✓
  3. 重复操作5次(不同规则)
  4. 数据更新了……全部重设格式!

一上午又没了!

二、Python的“美颜”魔法

今天教你用Styler给表格一键美颜:

import pandas as pd# 模拟费用数据df = pd.DataFrame({'部门': ['技术部', '市场部', '行政部', '财务部', '后勤部'],'预算': [10000, 8000, 5000, 6000, 4000],'实际': [9500, 9200, 4800, 6500, 3800],'完成率': [0.95, 1.15, 0.96, 1.08, 0.95]})# 魔法开始:给表格上色styled_df = df.style \    .applymap(lambda x: 'color: red'if x > 1 else'color: green', subset=['完成率']) \    .bar(subset=['预算', '实际'], color='#5fba7d') \    .background_gradient(subset=['完成率'], cmap='RdYlGn')# 保存到Excel(带格式!)styled_df.to_excel('费用报表_美化.xlsx', engine='openpyxl')print("✅ 搞定!表格已美颜,快去打开看看!")
打开Excel看看效果:
  • 完成率列:>1 的红色,<1 的绿色
  • 预算/实际列:带绿色数据条
  • 完成率背景:红-黄-绿渐变色

全部自动生成,数据更新了重新运行代码即可!

三、分解“魔法”:每行代码在干什么?

3.1 基础:改字体颜色

df.style.applymap(lambda x: 'color: red'if x > 1 else'color: green')
  • .style:把普通DataFrame变成可样式化的对象
  • .applymap():给每个单元格单独设置样式
  • lambda x: 'color: red' if x > 1 else 'color: green':如果值>1返回红色样式,否则绿色

注意:返回的是CSS样式字符串,比如'color: red'、'background-color: yellow'

3.2 指定列操作

.subset=['完成率']  # 只对'完成率'列应用

可以在applymap、bar、background_gradient等方法后加subset参数,指定只处理某些列。

3.3 添加数据条(类似Excel)

.bar(subset=['预算', '实际'], color='#5fba7d')
  • .bar():在单元格里画数据条
  • color:条的颜色(可用十六进制或颜色名)

3.4 渐变色背景(类似色阶)

.background_gradient(subset=['完成率'], cmap='RdYlGn')
  • .background_gradient():根据数值大小给背景着色
  • cmap:颜色映射,'RdYlGn'是红-黄-绿,还有'Blues'、'Greens'等

3.5 保存带样式的Excel

styled_df.to_excel('文件名.xlsx', engine='openpyxl')

必须指定 engine='openpyxl',否则样式不会保存!

四、自己动手试试!

4.1 第一步:创建测试数据

import pandas as pd# 学生成绩表成绩表 = pd.DataFrame({'姓名': ['张三', '李四', '王五', '赵六', '钱七'],'班级': ['三(1)', '三(1)', '三(2)', '三(2)', '三(1)'],'语文': [85, 92, 78, 90, 88],'数学': [92, 88, 65, 95, 90],  # 故意放一个不及格'英语': [88, 85, 80, 92, 87],'总分': [265, 265, 223, 277, 265]})print("📋 原始成绩表:")print(成绩表)

4.2 第二步:给不及格的数学标红

# 定义标红函数def 标红不及格(分数):if 分数 < 60:return'background-color: red; color: white'return''styled = 成绩表.style.applymap(标红不及格, subset=['数学'])styled

Jupyter里直接运行会显示样式化的表格!

4.3 第三步:保存到Excel

styled.to_excel('成绩表_美颜.xlsx', engine='openpyxl')print("✅ 已保存!")

打开Excel看看,数学不及格的格子是不是红了?

五、办公实战1:费用超支预警表

import pandas as pd# 模拟各部门费用费用表 = pd.DataFrame({'部门': ['技术部', '市场部', '行政部', '财务部', '后勤部'],'预算': [10000, 8000, 5000, 6000, 4000],'实际': [9500, 9200, 4800, 6500, 3800],'负责人': ['张工', '李经理', '王主任', '赵总监', '刘主管']})# 计算差额和超支比例费用表['差额'] = 费用表['实际'] - 费用表['预算']费用表['超支比例'] = (费用表['差额'] / 费用表['预算']).round(2)def 超支颜色(val):if val > 0:return'background-color: #ffcccc'# 浅红背景elif val < 0:return'background-color: #ccffcc'# 浅绿背景return''def 比例颜色(val):if val > 0.1:return'color: red; font-weight: bold'elif val > 0:return'color: orange'else:return'color: green'# 应用样式styled = 费用表.style \    .applymap(超支颜色, subset=['差额']) \    .applymap(比例颜色, subset=['超支比例']) \    .bar(subset=['预算', '实际'], color='#5fba7d', vmin=0) \    .format({'预算': '¥{:,.0f}', '实际': '¥{:,.0f}', '差额': '¥{:+,.0f}', '超支比例': '{:.1%}'})# 保存styled.to_excel('费用超支预警.xlsx', engine='openpyxl')print("✅ 超支预警表已生成!")
效果:
  • 正差额红色背景,负差额绿色背景
  • 超支比例>10%红色加粗,0~10%橙色,节约绿色
  • 预算/实际带数据条
  • 金额自动加¥符号和千位分隔符,超支比例显示为百分比

六、办公实战2:学生成绩等级着色

import pandas as pd# 学生成绩(包含各科和总分)学生表 = pd.DataFrame({'姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八'],'班级': ['三(1)', '三(1)', '三(2)', '三(2)', '三(1)', '三(2)'],'语文': [85, 92, 78, 90, 88, 95],'数学': [92, 88, 65, 95, 90, 82],'英语': [88, 85, 80, 92, 87, 90],'总分': [265, 265, 223, 277, 265, 267]})# 计算平均分和等级学生表['平均分'] = (学生表['总分'] / 3).round(1)def 等级(分):if 分 >= 90: return'A'elif 分 >= 80: return'B'elif 分 >= 60: return'C'else: return'D'学生表['等级'] = 学生表['平均分'].apply(等级)# 定义等级颜色等级颜色 = {'A': 'background-color: #92d050; color: black','B': 'background-color: #ffff00; color: black','C': 'background-color: #ffc000; color: black','D': 'background-color: #ff0000; color: white'}def 等级样式(val):return 等级颜色.get(val, '')# 定义分数段背景def 分数背景(score):if score >= 90:return'background-color: #c6efce'# 浅绿elif score >= 80:return'background-color: #ffeb9c'# 浅黄elif score >= 60:return'background-color: #ffc7ce'# 浅红else:return'background-color: #f2f2f2; color: red'# 灰底红字# 应用样式styled = 学生表.style \    .applymap(等级样式, subset=['等级']) \    .applymap(分数背景, subset=['语文', '数学', '英语']) \    .bar(subset=['总分', '平均分'], color='#5b9bd5', align='left') \    .format({'平均分': '{:.1f}', '总分': '{:.0f}'})# 设置列宽(可选,但to_excel不直接支持列宽,需用ExcelWriter高级设置)# 这里简单保存styled.to_excel('学生成绩_美颜.xlsx', engine='openpyxl')print("✅ 成绩表美颜完成!")
效果:
  • 等级列:A绿、B黄、C橙、D红底白字
  • 各科分数:优秀浅绿、良好浅黄、及格浅红、不及格灰底红字
  • 总分/平均分带数据条

七、更多美化技巧

7.1 高亮最大值/最小值

def 高亮最大值(s):    is_max = s == s.max()return ['background-color: yellow'if v else''for v in is_max]styled = df.style.apply(高亮最大值, subset=['语文', '数学', '英语'])

7.2 添加标题和说明

虽然.style不能直接加标题,但可以在保存Excel后手动加,或者用ExcelWriter添加:

with pd.ExcelWriter('报表.xlsx', engine='openpyxl') as writer:    styled.to_excel(writer, sheet_name='数据', index=False)# 可以在这里用openpyxl操作工作表,比如设置列宽、添加标题行等

7.3 条件格式图标集(类似Excel的图标)

Pandas Styler原生不支持图标集,但可以用background_gradient模拟,或者用bar显示数据条。如果需要图标,可以结合openpyxl的条件格式,但较复杂。通常背景色和数据条已够用。

7.4 数字格式化

styled.format({'金额': '¥{:,.2f}', '比例': '{:.1%}'})

八、常用样式方法速查表

方法
作用
示例
.applymap(func)
每个单元格单独设置
.applymap(lambda x: 'color: red' if x>0 else '')
.apply(func, axis)
每行/每列批量设置
.apply(highlight_max, axis=0)
.bar()
添加数据条
.bar(subset=['列'], color='blue')
.background_gradient()
渐变色背景
.background_gradient(cmap='Blues')
.text_gradient()
文字渐变色(少用)
.highlight_max()
高亮最大值
.highlight_max(color='yellow')
.highlight_min()
高亮最小值
.highlight_min(color='lightblue')
.highlight_null()
高亮空值
.highlight_null(color='gray')
.format()
格式化显示
.format({'列':'{:.2f}'})
.set_table_styles()
自定义表格样式(边框等)
.set_table_styles([{'selector': 'th', 'props': [('background', 'lightgray')]}])

九、重点总结:今天你学会了什么?

✅ 核心技能
  1. .style - 给DataFrame穿衣服
  2. .applymap() - 逐个单元格设样式
  3. .bar() - 画数据条
  4. .background_gradient() - 渐变色背景
  5. .format() - 数字美化
  6. 保存带样式的Excel - to_excel(..., engine='openpyxl')
✅ 办公应用场景
  1. 费用预警:超支标红,节约标绿
  2. 成绩分析:按等级着色,数据条对比
  3. KPI考核:完成率色阶,异常值高亮
  4. 任何需要给领导看的报表:一键美化
✅ 效率对比
任务
Excel操作
Python代码
设置3个条件格式
10分钟
10行代码
数据条+色阶
逐个设置
1行代码
更新数据后重设
全部重来
重新运行

十、今日挑战:动手做!

任务1:给成绩表加数据条和颜色

# 用下面的数据df = pd.DataFrame({'姓名': ['张三', '李四', '王五'],'一季度': [85, 92, 78],'二季度': [88, 90, 82],'三季度': [90, 91, 85]})# 任务:给一季度、二季度、三季度加数据条,平均分用渐变色

任务2:超支预警(自己设计规则)

# 某项目支出表项目表 = pd.DataFrame({'项目': ['A项目', 'B项目', 'C项目', 'D项目'],'预算': [50000, 30000, 20000, 40000],'已支出': [48000, 32000, 19000, 45000]})# 任务:添加“剩余”列,剩余为负的标红背景,为正的标绿背景

任务3:美化考勤表

# 员工考勤考勤 = pd.DataFrame({'姓名': ['张工', '李工', '王工'],'出勤天数': [22, 20, 21],'迟到次数': [0, 3, 1],'请假天数': [0, 2, 1]})# 任务:迟到>2的标黄,请假>1的标蓝,出勤满勤的加粗

十一、明日预告

明天学自动化办公终极武器:

  • 如何用Python定时发送邮件带美化后的报表?
  • 如何把多个Excel合并后自动美化并分发?
  • 如何用Python监控文件夹,新文件来了自动处理?

真正的“无人驾驶”办公,从明天开始!


回复「Py-Day」获取今日挑战题解及全部代码。

评论区作业:晒出你美化后的Excel截图,比比谁的最漂亮!👇

最新文章

随机文章