夜雨聆风学习资料网

ARTICLE · 1300781

Python 给 Excel 做"医美":openpyxl 样式自动化教程,3 秒美化报表

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_font    cell.fill = header_fill    cell.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 = border        if 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 = 0    for 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 批量处理、报表自动化的需求,欢迎关注公众号「数据技术分享」。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料