Openpyxl格式设置需手动构造Font、Border、PatternFill等对象并赋值,不支持字符串或字典传参;批量样式应避免逐单元格操作,优先用范围赋值或条件格式;Alignment需配合wrapText与vertical设置,保存前须确保文件未被占用且调用save()。

设置单元格字体、边框和填充色必须用 Font、Border、PatternFill 三类对象
Openpyxl 不支持像 Excel GUI 那样“一键套用样式”,所有格式都得手动构造并赋值给 cell.style 或直接写入 cell.font 等属性。常见错误是试图传入字符串(如 "bold")或字典,结果静默失败或报 AttributeError。
实操建议:
- 字体用
Font(name="微软雅黑", size=10, bold=True, color="2F5496"),颜色用六位十六进制(不带 #) - 边框用
Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="medium"), bottom=Side(style="medium"));style可选"thin"、"medium"、"thick"等,不能写"dashed"(Openpyxl 不支持虚线) - 填充色用
PatternFill("solid", fgColor="F2F2F2"),fgColor同样是六位十六进制,"solid"是唯一可靠填充实参
批量应用样式时别遍历每个 cell —— 用 worksheet.conditional_formatting 或范围赋值
对成百上千行逐个设 cell.font 极慢,且容易触发内存警告。Openpyxl 的单元格对象本身带开销,频繁访问会拖慢 3–5 倍。
实操建议:
- 纯静态样式(比如整列标题加粗+背景灰):用
ws["A1:Z1"][0]获取第一行 tuple,再循环设属性,比单 cell 访问快不少 - 条件样式(如数值 >100 标红):必须用
ws.conditional_formatting.add("B2:B1000", ColorScaleRule(...)),直接写规则,不走 cell 循环 - 避免在 for 循环里反复调用
ws.cell(row=i, column=j),改用ws.iter_rows(min_row=2, max_row=1000, values_only=False)一次取出行对象
Alignment 的 wrapText 和 vertical 参数常被忽略导致换行失效
很多人设了 alignment=Alignment(wrapText=True) 却发现文字还是挤在一行,原因是没同时打开单元格所在列的自动换行(Excel 层面),或者没设 vertical="center" 导致内容贴顶、视觉上像没换行。
实操建议:
-
Alignment(horizontal="center", vertical="center", wrapText=True)是最常用组合 - 如果内容是长文本,还得配合列宽调整:
ws.column_dimensions["A"].width = 30 -
vertical可选"top"、"center"、"bottom";"justify"在 Openpyxl 中行为不稳定,慎用
保存前必须调用 workbook.save(),且文件不能被 Excel 进程占用
样式代码执行完没报错,但打开 Excel 发现全是默认格式——大概率是忘记 .save(),或是 Windows 下 Excel 进程锁住了文件,导致 Openpyxl 写入的是临时副本。
实操建议:
- 保存路径用绝对路径,避免相对路径引发的
PermissionError - 运行脚本前关闭所有已打开的该 Excel 文件(包括后台隐藏的 Excel 进程)
- 若需覆盖原文件,先
os.remove()再.save(),否则 Windows 可能报Permission denied - 样式修改后不生效?加一句
print(ws["A1"].font.bold)验证是否真写进去了,排除逻辑顺序错误
Openpyxl 的样式系统是“对象驱动”而非“命令驱动”,每个格式项都对应一个独立类实例,漏掉任何一个构造步骤(比如只建 Font 没赋给 cell.font),就等于什么都没做。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











