Python Excel批量修改单元格字体:字号颜色加粗一键设置
用openpyxl的Font对象批量设置单元格字体、字号、颜色、加粗、斜体,避免在Excel里逐格设置,附完整代码。
场景痛点
报表交出去,领导嫌表头字太小、金额没加粗、颜色太淡。手动选中表头改字体、选中金额列改颜色,表多了就重复劳动。用 openpyxl 的 Font 对象,把表头统一设成「微软雅黑 12号 白色加粗」,把金额列统一设成红色,一次跑完,几十张表都一样。
用到的库
pip install openpyxl
完整代码
from openpyxl import load_workbook
from openpyxl.styles import Font
def style_header_and_money(file_path: str) -> None:
wb = load_workbook(file_path)
ws = wb.active
# 1) 定义两种字体,颜色用 ARGB 八进制串,前两位 FF 表示不透明
header_font = Font(
name="微软雅黑",
size=12,
bold=True,
color="FFFFFFFF", # 白色
)
money_font = Font(
name="Arial",
size=11,
bold=True,
color="FFFF0000", # 红色
)
# 2) 表头:第 1 行所有有内容的格子
for cell in ws[1]:
if cell.value is not None:
cell.font = header_font
# 3) 金额列:假设表头第 5 列是"金额",按列名找更稳
header_row = [c.value for c in ws[1]]
try:
money_col = header_row.index("金额") + 1 # openpyxl 列从 1 开始
except ValueError:
money_col = 5 # 找不到就兜底第 5 列
for row in range(2, ws.max_row + 1):
ws.cell(row=row, column=money_col).font = money_font
# 4) 整表统一正文字体(可选)
body_font = Font(name="微软雅黑", size=11)
for row in ws.iter_rows(min_row=2, max_row=ws.max_row,
min_col=1, max_col=ws.max_column):
for cell in row:
# 不覆盖上面已经设过的表头和金额列
if cell.row != 1 and cell.column != money_col:
cell.font = body_font
wb.save(file_path)
print("字体样式已应用并保存")
if __name__ == "__main__":
style_header_and_money(r"D:\reports\销售明细.xlsx")
代码讲解
Font(name=..., size=..., bold=..., color=...)是 openpyxl 的字体对象,属性包括字体名、字号、是否加粗、是否斜体、下划线、颜色。- 颜色字符串是 ARGB,8 位:前两位透明度(FF 不透明),后六位 RGB。白色
FFFFFFFF,红色FFFF0000。 ws[1]取第 1 行所有单元格,遍历设置表头字体。- 先把第 1 行读成列表,用
.index("金额")找到金额列的下标,再加 1 转成 openpyxl 的列号——比写死第 5 列更抗结构变化。 - 整表正文字体那段用
if跳过表头和金额列,避免后写的把前面的覆盖掉。 - 改完记得
wb.save(file_path),否则不落盘。
运行结果
打开处理后的 xlsx,第 1 行表头变成白色加粗微软雅黑 12 号,金额列变成红色加粗 Arial,其余正文是微软雅黑 11 号。
注意事项
Font是不可变样式对象,不能直接改cell.font.size = 12,必须整个替换成新的Font(...)。- 中文字体名要写 Excel 里显示的名字,比如「微软雅黑」「宋体」「等线」,写错了 Excel 打开会回退到默认字体。
- 颜色必须是 8 位 ARGB 或 16 进制 RGB 6 位,写
color="red"不会报错但不一定生效,建议写全FFFF0000。 - 大表逐格设样式较慢,几万行时尽量只设需要的列,别整表循环。
- 如果文件是
.xls老格式,openpyxl 处理不了,请先另存为.xlsx。

更新时间:2026-09-15 09:12:30