ARTICLE · 1300781
Python 给 Excel 做"医美":openpyxl 样式自动化教程,3 秒美化报表
上一篇我们用 Python 把数据写进了 Excel,但生成的表格丑得没法直接发给领导:没有标题、没有边框、列宽挤在一起,金额还是一长串裸数字。这一篇就解决 Excel 样式自动化的问题——用 openpyxl 给表格做一次"医美":标题合并居中、表头配色、斑马纹、数字千分位、列宽自适应,全部用 Python 代码自动完成。学会这套 Excel 批量美化方法,以后不管数据多少行,样式都是一键生成,再也不用手动刷格式。
为什么 Excel 样式要用 Python 自动化
很多人会说:调样式不就是点几下鼠标的事吗?还真不是。想象两个场景:
1、你每周要出 5 张结构相同的报表,每张都手动调一遍样式,一周就是 25 次重复劳动;
2、你用 Python 批量生成了 30 个分公司的销售表,难道打开 30 个文件逐个调格式?
手动调样式的问题在于不可复制。而 Python 样式自动化是"一次编写、处处生效"——样式规则写在代码里,任何同结构的表格套上去就是成品。这才是 Excel 自动化的真正威力。
我们的目标:把一张朴素的销售明细表(45 行数据,资料包里有现成的 销售明细_原始.xlsx),变成带大标题、彩色表头、斑马纹、千分位金额的专业报表。
openpyxl 样式三板斧:Font、PatternFill、Border
openpyxl 的样式体系里,90% 的需求靠这三个类解决:
Font:管字体、字号、加粗、颜色;PatternFill:管单元格底色(填充);Border + Side:管边框线条。
先引入它们,并打开上一篇生成的原始文件:
from openpyxl import load_workbookfrom openpyxl.styles import Font, PatternFill, Border, Side, Alignmentfrom openpyxl.utils import get_column_letterSRC = ”销售明细_原始.xlsx”# 原始数据文件DST = ”销售报表_美化后.xlsx”# 美化后输出文件wb = load_workbook(SRC)ws = wb.active
记住一个原则:样式是挂在单元格对象上的,改 cell.font、cell.fill、cell.border 就生效。
Python 合并单元格:给报表加一个大标题
正规报表第一行一定是居中大标题。做法是先插入一行,再把这一行的 8 个单元格合并:
ws.insert_rows(1)# 在最上面插入一行空行ws.merge_cells(”A1:H1”)# 合并 A1 到 H1title_cell = ws[”A1”]title_cell.value = ”2025年9月 3C数码产品销售明细表”title_cell.font = Font(name=”微软雅黑”, size=16, bold=True, color=”FFFFFF”)title_cell.fill = PatternFill(”solid”, fgColor=”2F5597”)# 深蓝色底title_cell.alignment = Alignment(horizontal=”center”, vertical=”center”)ws.row_dimensions[1].height = 32# 标题行高一点更大气
注意合并单元格后,只有左上角那个格子(A1)能读写内容,其余格子是"占位"的,这是 openpyxl 合并单元格最容易踩的坑。
表头配色 + 斑马纹:Python 让表格秒变专业
表头是报表的脸面。加粗白字、蓝底、居中,三行代码搞定:
header_font = Font(name=”微软雅黑”, size=11, bold=True, color=”FFFFFF”)header_fill = PatternFill(”solid”, fgColor=”4472C4”)center = Alignment(horizontal=”center”, vertical=”center”)for cell in ws[2]:# 第2行是表头cell.font = header_fontcell.fill = header_fillcell.alignment = center
数据区则推荐"细边框 + 斑马纹"组合,这是专业报表的标配,肉眼对齐特别舒服:
thin = Side(style=”thin”, color=”BFBFBF”)# 浅灰色细线border = Border(left=thin, right=thin, top=thin, bottom=thin)stripe_fill = PatternFill(”solid”, fgColor=”D9E2F3”)# 斑马纹浅蓝for row in ws.iter_rows(min_row=2, max_row=ws.max_row, min_col=1, max_col=8):for cell in row:cell.border = borderif cell.row > 2:if cell.row % 2 == 1:# 隔行填色cell.fill = stripe_fill
颜色用的是十六进制 RGB 值,推荐直接用 Excel 主题色(比如 4472C4 蓝、70AD47 绿),和领导审美天然兼容。
数字格式与列宽自适应:Excel 自动化的细节灵魂
金额显示成 1335 和 1,335.00,专业度天差地别。openpyxl 用 number_format 控制,格式串和 Excel 自定义格式完全通用:
for row in ws.iter_rows(min_row=3, max_row=ws.max_row, min_col=8, max_col=8):for cell in row:cell.number_format = ”#,##0.00”# 千分位 + 两位小数
最后是列宽自适应——openpyxl 没有真正的"自适应"按钮,但可以用 Python 自己算:遍历每列找出最长内容,中文按 2 个字符宽估算:
for col_idx in range(1, 9):letter = get_column_letter(col_idx)max_len = 0for cell in ws[letter]:if cell.value is not None:text = str(cell.value)width = sum(2 if ord(ch) > 127 else 1 for ch in text)# 中文算2个宽度max_len = max(max_len, width)ws.column_dimensions[letter].width = max_len + 4# 留点余量
再加一行 ws.freeze_panes = "A3" 冻结标题和表头,滚动数据时表头纹丝不动。最后 wb.save(DST) 保存,收工。
完整代码与运行效果
上面几段按顺序拼起来就是完整脚本(资料包里的 demo_style.py 已经帮你拼好)。运行方式:
python demo_style.py运行后生成 销售报表_美化后.xlsx:深蓝大标题、亮蓝表头、隔行浅蓝斑马纹、金额千分位、列宽刚好放下内容——整个过程不到 3 秒。同样的代码套在任何同结构表格上都成立,这就是 Python Excel 自动化的复利。
下一篇我们更进一步:不只要"美",还要"批量"——用模板填充法,设计一次模板,月月复用,一键生成 12 个月、30 个分公司的格式统一报表。
📌有类似需求?如果你也有 Excel 批量处理、报表自动化的需求,欢迎关注公众号「数据技术分享」。















































































