openpyxl 的样式功能非常强大,主要包括以下几个方面:

- 字体:设置字体名称、大小、颜色、加粗、斜体等。
- 填充:设置单元格的背景颜色或图案。
- 边框:设置单元格的边框样式、颜色和粗细。
- 对齐:设置单元格内容的水平/垂直对齐方式、文本换行、旋转等。
- 数字格式:设置数字、日期、货币的显示格式。
- 保护:设置单元格是否锁定或隐藏公式。
- 行高和列宽。
核心思想是:先创建一个样式对象,然后将这个对象应用到单元格上。
基本步骤
使用 openpyxl 应用样式的基本流程如下:
- 导入
openpyxl和openpyxl.styles中的相关模块。 - 加载一个工作簿或创建一个新的工作簿。
- 选择一个工作表。
- 获取一个单元格或一个单元格范围。
- 创建一个样式对象(
Font,PatternFill,Border等)。 - 将样式对象的属性赋值给单元格的
font,fill,border等属性。
样式详解与代码示例
准备工作
确保你已经安装了 openpyxl:
pip install openpyxl
我们创建一个示例脚本。

示例:创建一个新工作簿并应用样式
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment, NamedStyle
# 1. 创建一个新的工作簿
wb = Workbook()
# 2. 获取活动工作表
ws = wb.active= "样式示例"
# --- 样式定义 ---
# 5.1 字体样式
# 创建一个字体对象
bold_font = Font(name='Arial', size=12, bold=True, color='FF0000') # 红色加粗字体
italic_font = Font(name='Calibri', size=11, italic=True, color='0000FF') # 蓝色斜体字体
# 5.2 填充样式
# 创建一个填充对象
red_fill = PatternFill(start_color='FFFF0000', end_color='FFFF0000', fill_type='solid') # 红色实心填充
green_fill = PatternFill(start_color='FF00FF00', end_color='FF00FF00', fill_type='solid') # 绿色实心填充
# 5.3 边框样式
# 创建边框对象
thin_border = Border(
left=Side(style='thin', color='000000'),
right=Side(style='thin', color='000000'),
top=Side(style='thin', color='000000'),
bottom=Side(style='thin', color='000000')
)
thick_border = Border(
left=Side(style='thick', color='000000'),
right=Side(style='thick', color='000000'),
top=Side(style='thick', color='000000'),
bottom=Side(style='thick', color='000000')
)
# 5.4 对齐样式
# 创建对齐对象
center_alignment = Alignment(horizontal='center', vertical='center', wrap_text=True) # 水平垂直居中,自动换行
# --- 应用样式 ---
# 6. 将样式应用到单元格
ws['A1'] = '红色加粗字体'
ws['A1'].font = bold_font
ws['A2'] = '蓝色斜体字体'
ws['A2'].font = italic_font
ws['B1'] = '红色填充'
ws['B1'].fill = red_fill
ws['B2'] = '绿色填充'
ws['B2'].fill = green_fill
ws['C1'] = '细边框'
ws['C1'].border = thin_border
ws['C2'] = '粗边框'
ws['C2'].border = thick_border
ws['D1'] = '这是一个很长的文本,为了测试自动换行功能,它需要跨越多行显示。'
ws['D1'].alignment = center_alignment
# --- 组合应用样式 ---
# 一个单元格可以同时应用多种样式
ws['A3'] = '组合样式'
ws['A3'].font = bold_font
ws['A3'].fill = green_fill
ws['A3'].border = thin_border
ws['A3'].alignment = center_alignment
# --- 保存工作簿 ---
filename = 'styled_example.xlsx'
wb.save(filename)
print(f"文件 '{filename}' 已成功创建!")
数字格式
数字格式对于显示日期、时间、货币等非常重要。
from openpyxl.styles import numbers
from datetime import datetime
# ... (接上面的代码) ...
ws['E1'] = '数字格式示例'
ws['E1'].font = bold_font
# 设置日期格式
ws['E2'] = datetime.now()
ws['E2'].number_format = 'yyyy-mm-dd hh:mm:ss' # 自定义日期时间格式
# 设置货币格式
ws['E3'] = 12345.6789
ws['E3'].number_format = '$#,##0.00' # 货币格式
# 设置百分比格式
ws['E4'] = 0.85
ws['E4'].number_format = '0.00%' # 百分比格式
# 设置千位分隔符
ws['E5'] = 9876543.21
ws['E5'].number_format = '#,##0.00' # 千位分隔符
wb.save('styled_example.xlsx')
使用 NamedStyle (命名样式)
当你想在多个地方使用完全相同的样式时,使用 NamedStyle 会更方便,你可以定义一个样式名称,然后像应用内置样式一样应用它。
from openpyxl.styles import NamedStyle
# ... (接上面的代码) ...
# 创建一个命名样式
header_style = NamedStyle(name="header_style")
header_style.font = Font(name='Arial', bold=True, size=14, color='FFFFFF')
header_style.fill = PatternFill(start_color='366092', end_color='366092', fill_type='solid')
header_style.alignment = Alignment(horizontal='center', vertical='center')
# 将这个命名样式应用到多个单元格
ws['A6'] = '表头1'
ws['B6'] = '表头2'
ws['C6'] = '表头3'
for cell in ws['A6:C6']:
cell.style = header_style
# 保存
wb.save('styled_example.xlsx')
行高和列宽
样式也包含对行和列的尺寸设置。
# ... (接上面的代码) ...
# 设置行高
# ws.row_dimensions[1].height = 30 # 设置第一行的高度为30
# 设置列宽
# ws.column_dimensions['A'].width = 20 # 设置A列的宽度为20
# 也可以一次性设置多行或多列的高度和宽度
# for row in ws.iter_rows(min_row=1, max_row=10):
# for cell in row:
# ws.row_dimensions[cell.row].height = 25
# ws.column_dimensions['A'].width = 30
# ws.column_dimensions['B'].width = 20
# 更简单的方法是使用 `dimenstion` 属性
ws.row_dimensions[1].height = 30
ws.column_dimensions['A'].width = 25
wb.save('styled_example.xlsx')
完整示例代码
下面是一个将所有知识点整合在一起的完整脚本。

from openpyxl import Workbook
from openpyxl.styles import (
Font, PatternFill, Border, Side, Alignment, NamedStyle, numbers
)
from datetime import datetime
# --- 1. 创建工作簿 ---
wb = Workbook()
ws = wb.active= "综合样式示例"
# --- 2. 定义常用样式对象 ---
# 字体font = Font(name='微软雅黑', size=16, bold=True, color='FFFFFF')
header_font = Font(name='Arial', size=12, bold=True, color='FFFFFF')
data_font = Font(name='Calibri', size=11)
# 填充fill = PatternFill(start_color='4472C4', end_color='4472C4', fill_type='solid')
header_fill = PatternFill(start_color='70AD47', end_color='70AD47', fill_type='solid')
alternate_row_fill = PatternFill(start_color='D9E1F2', end_color='D9E1F2', fill_type='solid')
# 边框
thin_border = Border(
left=Side(style='thin'), right=Side(style='thin'),
top=Side(style='thin'), bottom=Side(style='thin')
)
header_border = Border(
left=Side(style='medium'), right=Side(style='medium'),
top=Side(style='medium'), bottom=Side(style='medium')
)
# 对齐
center_alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
left_alignment = Alignment(horizontal='left', vertical='center', wrap_text=True)
# --- 3. 准备数据 ---
data = [
['姓名', '年龄', '入职日期', '工资', '绩效'],
['张三', 28, datetime(2025, 5, 15), 8500.50, 0.95],
['李四', 32, datetime(2025, 8, 22), 10200.00, 1.10],
['王五', 25, datetime(2025, 1, 10), 7200.75, 0.88],
['赵六', 45, datetime(2025, 3, 5), 15000.00, 1.25],
]
# --- 4. 写入数据并应用样式 ---
ws['A1'] = '员工信息表'
ws['A1'].font = title_font
ws['A1'].fill = title_fill
ws['A1'].alignment = center_alignment
# 合并单元格
ws.merge_cells('A1:E1')行高
ws.row_dimensions[1].height = 25
# 写入表头和数据
for i, row_data in enumerate(data, start=2):
for j, value in enumerate(row_data, start=1):
cell = ws.cell(row=i, column=j, value=value)
if i == 2: # 表头行
cell.font = header_font
cell.fill = header_fill
cell.border = header_border
cell.alignment = center_alignment
else: # 数据行
cell.font = data_font
cell.border = thin_border
cell.alignment = left_alignment
# 设置数字格式
if j == 3: # 日期列
cell.number_format = 'yyyy-mm-dd'
elif j == 4: # 工资列
cell.number_format = '$#,##0.00'
elif j == 5: # 绩效列
cell.number_format = '0.00%'
# 设置隔行变色
if i % 2 == 0:
cell.fill = alternate_row_fill
# --- 5. 调整列宽 ---
column_widths = {
'A': 15, 'B': 10, 'C': 12, 'D': 12, 'E': 10
}
for col, width in column_widths.items():
ws.column_dimensions[col].width = width
# --- 6. 保存文件 ---
filename = 'comprehensive_style.xlsx'
wb.save(filename)
print(f"文件 '{filename}' 已成功创建,请查看效果!")
运行这个脚本后,你将得到一个格式非常专业的 Excel 文件。
- 模块化:
openpyxl的样式是模块化的,Font负责字体,Fill负责填充,你可以自由组合。 - 对象化:样式是作为对象创建的,然后赋值给单元格的属性。
- 可复用:通过
NamedStyle可以定义和复用复杂的样式集合。 - 性能:对于非常大的文件,频繁地逐个设置样式可能会影响性能,可以考虑使用
openpyxl.worksheet.worksheet.WriteOnlyWorksheet模式,或者对样式进行缓存。
希望这个详细的指南能帮助你掌握 openpyxl 的样式功能!
