Python办公自动化教程 - 第2章 单元格样式魔法 - 让表格变得美观专业

第2章 单元格样式魔法 - 让表格变得美观专业

2.1 本章学习目标

通过本章学习,你将掌握:

  1. 字体样式:设置字体、字号、颜色、粗体斜体等
  2. 填充样式:设置单元格背景色、渐变、图案
  3. 边框样式:设置单元格边框线
  4. 对齐方式:设置水平和垂直对齐、自动换行
  5. 条件格式:使用色阶、数据条、图标集

2.2 为什么需要样式?

🌟 生活类比:想象一下,你收到两份报告:一份是白底黑字密密麻麻的表格,另一份有清晰的标题、交替的行颜色、醒目的总计行。哪一份更让你愿意阅读?

好的样式不仅美观,还能:

  • 突出重点:让重要数据一目了然
  • 提高可读性:斑马纹、边框让数据更易追踪
  • 专业形象:给同事、客户留下好印象

2.3 样式系统概览

openpyxl的样式系统就像一套完整的"装修工具箱":
单元格样式系统
字体 Font
填充 Fill
边框 Border
对齐 Alignment
数字格式 Number Format
条件格式 Conditional Formatting
字体名称
字号大小
粗体/斜体
字体颜色
纯色填充
渐变填充
图案填充
边框线样式
边框线颜色
四边独立设置
水平对齐
垂直对齐
自动换行
千分位格式
百分比格式
货币格式
日期格式
色阶
数据条
图标集

2.4 实例1:创建格式化销售报表 📊

📁 代码路径 : openpyxl-tutorial/chapter_02_formatting/create_sales_report.py

📝 场景:创建一份专业的季度销售报表,包含标题、表头、数据行、汇总行,应用各种样式

📝 开发思路

  1. 导入必要的样式类(Font, PatternFill, Border, Side, Alignment等)
  2. 定义各种样式对象(标题、表头、数据、汇总等)
  3. 创建报表结构:标题行、表头行、数据行、汇总行
  4. 应用样式到各个单元格
  5. 设置列宽和数字格式
  6. 添加条件格式(色阶、数据条、图标集)
  7. 冻结窗格固定表头
  8. 保存文件
python 复制代码
# -*- coding: utf-8 -*-
"""
================================================================================
第2章/创建格式化销售报表
================================================================================
开发思路:
1. 导入必要的样式类(Font, PatternFill, Border, Side, Alignment等)
2. 定义各种样式对象(标题、表头、数据、汇总等)
3. 创建报表结构:标题行、表头行、数据行、汇总行
4. 应用样式到各个单元格
5. 设置列宽和数字格式
6. 添加条件格式(色阶、数据条、图标集)
7. 冻结窗格固定表头
8. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入样式相关类
from openpyxl.styles import (
  Font,  # 字体样式
  PatternFill,  # 图案填充
  GradientFill,  # 渐变填充
  Border,  # 边框
  Side,  # 边框线
  Alignment,  # 对齐方式
  Protection  # 保护设置
)

# 导入条件格式规则
from openpyxl.formatting.rule import (
  ColorScaleRule,  # 色阶规则
  DataBarRule,  # 数据条规则
  IconSetRule,  # 图标集规则
  CellIsRule  # 单元格值规则
)

# 导入工具函数
from openpyxl.utils import get_column_letter

# 导入os模块处理文件路径
import os


def create_sales_report():
  """
  创建销售报表 - 生产场景:月度销售业绩统计
  展示各种样式和格式化技巧
  """
  # 创建工作簿
  wb = Workbook()
  ws = wb.active
  ws.title = "销售报表"

  # ==================== 1. 定义样式对象 ====================

  # ----- 字体样式 -----
  # Font 类用于设置字体属性
  # name: 字体名称, size: 字号, bold: 粗体, italic: 斜体
  # color: 字体颜色(RGB 十六进制字符串)
  title_font = Font(
    name='微软雅黑',  # 字体名称
    size=18,  # 字号 18
    bold=True,  # 粗体
    color='FFFFFF'  # 白色字体
  )

  header_font = Font(
    name='微软雅黑',
    size=11,
    bold=True,
    color='FFFFFF'
  )

  data_font = Font(
    name='微软雅黑',
    size=10,
    color='333333'
  )

  # 特殊字体:用于突出显示
  highlight_font = Font(
    name='微软雅黑',
    size=10,
    bold=True,
    color='C00000'  # 深红色
  )

  # ----- 填充样式 -----
  # PatternFill 用于设置单元格背景填充
  # start_color 和 end_color 设置起始和结束颜色
  # fill_type 设置填充类型:'solid' 实心填充
  title_fill = PatternFill(
    start_color='4472C4',  # 蓝色
    end_color='4472C4',
    fill_type='solid'
  )

  header_fill = PatternFill(
    start_color='5B9BD5',  # 浅蓝色
    end_color='5B9BD5',
    fill_type='solid'
  )

  # 交替行填充色(用于斑马纹效果)
  alternate_fill = PatternFill(
    start_color='D9E1F2',  # 淡蓝色
    end_color='D9E1F2',
    fill_type='solid'
  )

  # 总计行填充
  total_fill = PatternFill(
    start_color='FFF2CC',  # 淡黄色
    end_color='FFF2CC',
    fill_type='solid'
  )

  # ----- 边框样式 -----
  # Side 类定义边框线的样式
  # style: 线条样式 ('thin', 'medium', 'thick', 'dashed', 'dotted' 等)
  # color: 边框颜色
  thin_border = Side(
    style='thin',  # 细线
    color='CCCCCC'  # 浅灰色
  )

  medium_border = Side(
    style='medium',  # 中等粗细
    color='4472C4'  # 蓝色
  )

  # Border 类组合四个边的边框
  # left, right, top, bottom 分别设置四边
  data_border = Border(
    left=thin_border,
    right=thin_border,
    top=thin_border,
    bottom=thin_border
  )

  header_border = Border(
    left=medium_border,
    right=medium_border,
    top=medium_border,
    bottom=medium_border
  )

  # ----- 对齐方式 -----
  # Alignment 类设置单元格对齐
  # horizontal: 水平对齐 ('left', 'center', 'right')
  # vertical: 垂直对齐 ('top', 'center', 'bottom')
  # wrap_text: 自动换行
  # shrink_to_fit: 缩小字体以适应
  center_align = Alignment(
    horizontal='center',  # 水平居中
    vertical='center',  # 垂直居中
    wrap_text=True  # 自动换行
  )

  left_align = Alignment(
    horizontal='left',
    vertical='center'
  )

  right_align = Alignment(
    horizontal='right',
    vertical='center'
  )

  # ==================== 2. 创建报表标题 ====================
  # 合并单元格作为标题区域
  # merge_cells() 方法合并指定范围的单元格
  ws.merge_cells('A1:H1')

  # 获取合并后的单元格并设置值和样式
  title_cell = ws['A1']
  title_cell.value = '2024年第一季度销售报表'
  title_cell.font = title_font
  title_cell.fill = title_fill
  title_cell.alignment = center_align

  # 设置标题行高度
  ws.row_dimensions[1].height = 35

  # ==================== 3. 创建表头 ====================
  # 表头内容
  headers = ['序号', '销售区域', '销售人员', '产品类别', '销售额(元)', '完成率', '排名', '备注']

  # 写入表头并应用样式
  for col, header in enumerate(headers, start=1):
    cell = ws.cell(row=3, column=col)
    cell.value = header
    cell.font = header_font
    cell.fill = header_fill
    cell.border = header_border
    cell.alignment = center_align

  # 设置表头行高度
  ws.row_dimensions[3].height = 25

  # ==================== 4. 填充销售数据 ====================
  # 模拟真实的销售数据
  sales_data = [
    {'region': '华北区', 'salesman': '张伟', 'category': '电子产品', 'amount': 1580000, 'rate': 1.05},
    {'region': '华北区', 'salesman': '李娜', 'category': '家用电器', 'amount': 920000, 'rate': 0.92},
    {'region': '华东区', 'salesman': '王强', 'category': '电子产品', 'amount': 2100000, 'rate': 1.15},
    {'region': '华东区', 'salesman': '刘芳', 'category': '办公用品', 'amount': 680000, 'rate': 0.88},
    {'region': '华南区', 'salesman': '陈明', 'category': '电子产品', 'amount': 1850000, 'rate': 1.08},
    {'region': '华南区', 'salesman': '杨丽', 'category': '家用电器', 'amount': 1150000, 'rate': 0.98},
    {'region': '西南区', 'salesman': '赵军', 'category': '办公用品', 'amount': 450000, 'rate': 0.75},
    {'region': '西南区', 'salesman': '周婷', 'category': '电子产品', 'amount': 1320000, 'rate': 0.95},
    {'region': '华中区', 'salesman': '吴磊', 'category': '家用电器', 'amount': 1680000, 'rate': 1.12},
    {'region': '华中区', 'salesman': '郑雪', 'category': '办公用品', 'amount': 580000, 'rate': 0.82},
  ]

  # 按销售额排序,计算排名
  sorted_data = sorted(sales_data, key=lambda x: x['amount'], reverse=True)
  for i, item in enumerate(sorted_data):
    item['rank'] = i + 1

  # 写入数据行
  for row_idx, data in enumerate(sorted_data, start=4):
    # 根据排名确定备注
    if data['rate'] >= 1.0:
      remark = '超额完成'
    elif data['rate'] >= 0.9:
      remark = '达标'
    else:
      remark = '未达标'

    # 准备一行数据
    row_data = [
      row_idx - 3,  # 序号
      data['region'],  # 销售区域
      data['salesman'],  # 销售人员
      data['category'],  # 产品类别
      data['amount'],  # 销售额
      data['rate'],  # 完成率
      data['rank'],  # 排名
      remark  # 备注
    ]

    # 写入数据并应用样式
    for col_idx, value in enumerate(row_data, start=1):
      cell = ws.cell(row=row_idx, column=col_idx)
      cell.value = value
      cell.font = data_font
      cell.border = data_border

      # 斑马纹效果:偶数行使用淡蓝色背景
      if row_idx % 2 == 0:
        cell.fill = alternate_fill

      # 根据列设置对齐方式
      if col_idx in [1, 6, 7]:  # 序号、完成率、排名居中
        cell.alignment = center_align
      elif col_idx == 5:  # 销售额右对齐
        cell.alignment = right_align
      else:
        cell.alignment = left_align

  # ==================== 5. 添加汇总行 ====================
  total_row = len(sales_data) + 4
  ws.merge_cells(f'A{total_row}:D{total_row}')

  total_cell = ws.cell(row=total_row, column=1)
  total_cell.value = '合计'
  total_cell.font = Font(name='微软雅黑', size=11, bold=True)
  total_cell.fill = total_fill
  total_cell.alignment = center_align
  total_cell.border = data_border

  # 销售额合计(使用公式)
  amount_total_cell = ws.cell(row=total_row, column=5)
  amount_total_cell.value = f'=SUM(E4:E{total_row - 1})'
  amount_total_cell.font = highlight_font
  amount_total_cell.fill = total_fill
  amount_total_cell.border = data_border
  amount_total_cell.alignment = right_align

  # 平均完成率
  rate_avg_cell = ws.cell(row=total_row, column=6)
  rate_avg_cell.value = f'=AVERAGE(F4:F{total_row - 1})'
  rate_avg_cell.font = highlight_font
  rate_avg_cell.fill = total_fill
  rate_avg_cell.border = data_border
  rate_avg_cell.alignment = center_align

  # 其他单元格也应用边框和填充
  for col in range(7, 9):
    cell = ws.cell(row=total_row, column=col)
    cell.fill = total_fill
    cell.border = data_border

  # ==================== 6. 设置列宽 ====================
  # column_dimensions 用于设置列的宽度
  column_widths = {
    'A': 8,  # 序号
    'B': 12,  # 销售区域
    'C': 12,  # 销售人员
    'D': 12,  # 产品类别
    'E': 15,  # 销售额
    'F': 12,  # 完成率
    'G': 8,  # 排名
    'H': 12  # 备注
  }

  for col_letter, width in column_widths.items():
    ws.column_dimensions[col_letter].width = width

  # ==================== 7. 设置数字格式 ====================
  # 销售额列:千分位格式
  for row in range(4, total_row):
    ws.cell(row=row, column=5).number_format = '#,##0'

  # 完成率列:百分比格式
  for row in range(4, total_row + 1):
    ws.cell(row=row, column=6).number_format = '0.0%'

  # ==================== 8. 添加条件格式 ====================

  # ----- 色阶:销售额列 -----
  # ColorScaleRule 创建色阶条件格式
  # start_type, mid_type, end_type: 类型可以是 'min', 'max', 'num', 'percent', 'formula'
  # start_color, mid_color, end_color: 对应的颜色
  color_scale = ColorScaleRule(
    start_type='min', start_color='F8696B',  # 红色(低)
    mid_type='percentile', mid_value=50, mid_color='FFEB84',  # 黄色(中)
    end_type='max', end_color='63BE7B'  # 绿色(高)
  )
  # 将色阶应用到销售额列(E4:E13)
  ws.conditional_formatting.add(f'E4:E{total_row - 1}', color_scale)

  # ----- 数据条:完成率列 -----
  # DataBarRule 创建数据条
  data_bar = DataBarRule(
    start_type='num', start_value=0,
    end_type='num', end_value=1.5,
    color='5B9BD5',  # 数据条颜色
    showValue=True,  # 显示数值
    minLength=None,
    maxLength=None
  )
  ws.conditional_formatting.add(f'F4:F{total_row - 1}', data_bar)

  # ----- 图标集:排名列 -----
  # IconSetRule 创建图标集
  icon_set = IconSetRule(
    '3TrafficLights1',  # 图标集类型:红绿灯
    'num',  # 类型
    [0, 4, 7],  # 阈值:1-3名绿灯,4-6名黄灯,7名以后红灯
    showValue=True
  )
  ws.conditional_formatting.add(f'G4:G{total_row - 1}', icon_set)

  # ----- 单元格值规则:备注列 -----
  # 未达标的单元格标红
  red_fill = PatternFill(start_color='FFC7CE', end_color='FFC7CE', fill_type='solid')
  red_font = Font(color='9C0006')

  cell_rule = CellIsRule(
    operator='equal',
    formula=['"未达标"'],
    fill=red_fill,
    font=red_font
  )
  ws.conditional_formatting.add(f'H4:H{total_row - 1}', cell_rule)

  # ==================== 9. 冻结窗格 ====================
  # freeze_panes 冻结窗格,参数是冻结位置的下一个单元格
  # 这里冻结前 3 行和前 0 列(即冻结表头)
  ws.freeze_panes = 'A4'

  # ==================== 10. 保存文件 ====================
  output_dir = os.path.join(os.path.dirname(__file__), "output")
  os.makedirs(output_dir, exist_ok=True)
  file_path = os.path.join(output_dir, "销售报表_格式化.xlsx")
  wb.save(file_path)

  print("=" * 60)
  print("销售报表创建成功!")
  print("=" * 60)
  print(f"文件路径: {file_path}")
  print("\n应用的样式:")
  print("  ✓ 字体:微软雅黑,多种字号和颜色")
  print("  ✓ 填充:标题蓝色、表头浅蓝、斑马纹淡蓝")
  print("  ✓ 边框:细边框和中等边框")
  print("  ✓ 对齐:居中、左对齐、右对齐")
  print("  ✓ 数字格式:千分位、百分比")
  print("  ✓ 条件格式:色阶、数据条、图标集、单元格规则")
  print("  ✓ 冻结窗格:固定表头")

  wb.close()
  return file_path


# 如果这个脚本被直接运行(不是被导入),则执行以下代码
if __name__ == "__main__":
  output_path = create_sales_report()
📊 知识图谱

销售报表样式系统
样式系统
字体 Font
填充 Fill
边框 Border
对齐 Alignment
条件格式
标题字体

微软雅黑 18号 粗体 白色
表头字体

微软雅黑 11号 粗体 白色
数据字体

微软雅黑 10号
汇总字体

微软雅黑 11号 粗体 红色
标题填充

深蓝色
表头填充

浅蓝色
斑马纹

交替淡蓝
汇总填充

浅黄色
细边框

thin
中等边框

medium
标题

跨列居中
表头

居中
数据

左对齐/居中
色阶

绿黄红
数据条
图标集

红黄绿
单元格规则

📊 代码执行时序图

文件系统 Cell对象 Workbook类 Python脚本 用户 文件系统 Cell对象 Workbook类 Python脚本 用户 运行脚本 创建工作簿 返回wb对象 wb.active获取工作表 返回ws对象 定义样式对象 Font/PatternFill/Border等 创建标题行并应用样式 设置字体、填充、对齐 创建表头行并应用样式 设置字体、填充、边框 写入数据行 应用斑马纹样式 添加条件格式 色阶、数据条、图标集 冻结窗格 固定表头 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息

🖨️ 代码运行效果

运行上述代码后,会生成一个名为 销售报表.xlsx 的Excel文件,效果如下:

📊 销售报表效果展示

报表特点说明:

  • 标题行:蓝色背景、白色粗体大字、跨列居中
  • 表头行:浅蓝背景、粗体、居中对齐
  • 数据行:斑马纹(交替淡蓝背景),提高可读性
  • 销售额列:千分位格式、色阶(绿-黄-红)、数据条
  • 完成率列:百分比格式、图标集(红黄绿圆圈)
  • 排名列:居中对齐
  • 备注列:条件格式(超额完成绿色、达标蓝色、未达标红色)
  • 汇总行:浅黄背景、粗体、红色总计数字
  • 冻结窗格:表头固定,滚动时始终可见
📁 生成的文件结构
复制代码
openpyxl_tutorial/
├── chapter_02_formatting/
│   ├── create_sales_report.py       # 演示脚本
└── output/
    └── 销售报表.xlsx                 # 生成的Excel文件

2.5 实例2:字体样式演示 🔤

📁 代码路径 : openpyxl-tutorial/chapter_02_formatting/demonstrate_font_styles.py

📝 场景:展示各种字体样式效果

📝 开发思路

  1. 创建工作簿
  2. 设置列宽以便显示效果
  3. 创建各种字体样式示例(粗体、斜体、下划线、颜色等)
  4. 保存文件
python 复制代码
# -*- coding: utf-8 -*-
"""
================================================================================
第2章/字体样式演示
================================================================================
开发思路:
1. 创建工作簿
2. 设置列宽以便显示效果
3. 创建各种字体样式示例(粗体、斜体、下划线、颜色等)
4. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入Font类用于设置字体
from openpyxl.styles import Font

# 导入os模块处理文件路径
import os


def demonstrate_font_styles():
  """
  演示各种字体样式
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "字体样式演示"

  # 设置列宽
  ws.column_dimensions['A'].width = 20
  ws.column_dimensions['B'].width = 30

  # 标题
  ws['A1'] = '字体样式'
  ws['B1'] = '示例文本'
  ws['A1'].font = Font(bold=True, size=12)
  ws['B1'].font = Font(bold=True, size=12)

  # 各种字体样式示例
  font_examples = [
    ('默认字体', Font()),
    ('粗体', Font(bold=True)),
    ('斜体', Font(italic=True)),
    ('粗斜体', Font(bold=True, italic=True)),
    ('下划线', Font(underline='single')),
    ('双下划线', Font(underline='double')),
    ('删除线', Font(strike=True)),
    ('红色字体', Font(color='FF0000')),
    ('蓝色粗体', Font(color='0000FF', bold=True)),
    ('大号字体', Font(size=16)),
    ('小号字体', Font(size=8)),
    ('微软雅黑', Font(name='微软雅黑', size=11)),
    ('宋体', Font(name='宋体', size=11)),
  ]

  for row, (desc, font_style) in enumerate(font_examples, start=2):
    ws.cell(row=row, column=1, value=desc)
    cell = ws.cell(row=row, column=2, value='这是一段示例文本')
    cell.font = font_style

  # 保存
  output_dir = os.path.join(os.path.dirname(__file__), "output")
  os.makedirs(output_dir, exist_ok=True)
  file_path = os.path.join(output_dir, "字体样式演示.xlsx")
  wb.save(file_path)

  print(f"\n字体样式演示文件已保存: {file_path}")
  wb.close()


# 如果这个脚本被直接运行(不是被导入),则执行以下代码
if __name__ == "__main__":
  demonstrate_font_styles()
📊 知识图谱

字体样式系统
Font字体类
字体名称
字号大小
字形样式
字体颜色
下划线
name

微软雅黑/宋体
size

8/10/12/16
bold

粗体
italic

斜体
strike

删除线
color

RGB十六进制
红色 FF0000
蓝色 0000FF
underline

single单线
underline

double双线

📊 代码执行时序图

文件系统 Cell对象 Font类 Workbook类 Python脚本 用户 文件系统 Cell对象 Font类 Workbook类 Python脚本 用户 loop [遍历13种字体样式] 运行脚本 创建工作簿 返回wb对象 wb.active获取工作表 返回ws对象 设置列宽 写入表头 应用粗体样式 创建Font对象 返回字体样式 写入描述文字 写入示例文本 cell.font应用样式 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息

🖨️ 代码运行效果

运行上述代码后,会生成一个名为 字体样式演示.xlsx 的Excel文件,效果如下:

📊 字体样式效果展示

字体样式说明:

样式名称 效果描述
默认字体 标准字体样式
粗体 文字加粗显示
斜体 文字倾斜显示
粗斜体 同时加粗和倾斜
下划线 文字下方单线
双下划线 文字下方双线
删除线 文字中间横线
红色字体 文字颜色为红色
蓝色粗体 蓝色加粗文字
大号字体 字号放大显示
小号字体 字号缩小显示
微软雅黑 使用微软雅黑字体
宋体 使用宋体字体
📁 生成的文件结构
复制代码
openpyxl_tutorial/
├── chapter_02_formatting/
│   ├── demonstrate_font_styles.py   # 演示脚本
└── output/
    └── 字体样式演示.xlsx             # 生成的Excel文件

2.6 实例3:填充样式演示 🎨

📁 代码路径 : openpyxl-tutorial/chapter_02_formatting/demonstrate_fill_styles.py

📝 场景:展示各种填充样式效果

📝 开发思路

  1. 创建工作簿
  2. 使用PatternFill创建纯色填充示例
  3. 展示不同颜色的填充效果
  4. 保存文件
python 复制代码
# -*- coding: utf-8 -*-
"""
================================================================================
第2章/填充样式演示
================================================================================
开发思路:
1. 创建工作簿
2. 使用PatternFill创建纯色填充示例
3. 展示不同颜色的填充效果
4. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入PatternFill类用于设置填充
from openpyxl.styles import PatternFill

# 导入os模块处理文件路径
import os


def demonstrate_fill_styles():
  """
  演示各种填充样式
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "填充样式演示"

  # 设置列宽
  ws.column_dimensions['A'].width = 20
  ws.column_dimensions['B'].width = 20

  # 标题
  ws['A1'] = '填充类型'
  ws['B1'] = '示例'
  for cell in ['A1', 'B1']:
    ws[cell].font = Font(bold=True)

  # PatternFill 示例(图案填充)
  fills = [
    ('纯色填充-红', PatternFill(start_color='FF0000', fill_type='solid')),
    ('纯色填充-绿', PatternFill(start_color='00FF00', fill_type='solid')),
    ('纯色填充-蓝', PatternFill(start_color='0000FF', fill_type='solid')),
    ('纯色填充-黄', PatternFill(start_color='FFFF00', fill_type='solid')),
    ('纯色填充-灰', PatternFill(start_color='808080', fill_type='solid')),
  ]

  for row, (desc, fill) in enumerate(fills, start=2):
    ws.cell(row=row, column=1, value=desc)
    cell = ws.cell(row=row, column=2, value='')
    cell.fill = fill

  # 保存
  output_dir = os.path.join(os.path.dirname(__file__), "output")
  os.makedirs(output_dir, exist_ok=True)
  file_path = os.path.join(output_dir, "填充样式演示.xlsx")
  wb.save(file_path)

  print(f"填充样式演示文件已保存: {file_path}")
  wb.close()


# 修复导入问题
from openpyxl.styles import Font

# 如果这个脚本被直接运行(不是被导入),则执行以下代码
if __name__ == "__main__":
  demonstrate_fill_styles()
📊 知识图谱

填充样式系统
PatternFill填充类
填充类型
填充颜色
fill_type

solid纯色
fill_type

gradient渐变
start_color

起始颜色
end_color

结束颜色
红色 FF0000
绿色 00FF00
蓝色 0000FF
黄色 FFFF00
灰色 808080

📊 代码执行时序图

文件系统 Cell对象 PatternFill类 Workbook类 Python脚本 用户 文件系统 Cell对象 PatternFill类 Workbook类 Python脚本 用户 loop [遍历5种填充样式] 运行脚本 创建工作簿 返回wb对象 wb.active获取工作表 返回ws对象 设置列宽 写入表头 应用粗体样式 创建PatternFill对象 返回填充样式 写入填充类型描述 创建示例单元格 cell.fill应用样式 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息

🖨️ 代码运行效果

运行上述代码后,会生成一个名为 填充样式演示.xlsx 的Excel文件,效果如下:

📊 填充样式效果展示

填充样式说明:

填充类型 颜色 效果描述
纯色填充-红 红色 单元格背景为纯红色
纯色填充-绿 绿色 单元格背景为纯绿色
纯色填充-蓝 蓝色 单元格背景为纯蓝色
纯色填充-黄 黄色 单元格背景为纯黄色
纯色填充-灰 灰色 单元格背景为纯灰色

💡 PatternFill参数说明

  • start_color:填充颜色(RGB十六进制)
  • fill_type='solid':纯色填充类型
📁 生成的文件结构
复制代码
openpyxl_tutorial/
├── chapter_02_formatting/
│   ├── demonstrate_fill_styles.py   # 演示脚本
└── output/
    └── 填充样式演示.xlsx             # 生成的Excel文件

2.7 实例4:对齐方式演示 📐

📁 代码路径 : openpyxl-tutorial/chapter_02_formatting/demonstrate_alignment_styles.py

📝 场景:展示各种对齐方式效果

📝 开发思路

  1. 创建工作簿
  2. 设置行列尺寸以便展示效果
  3. 创建各种对齐方式示例(水平对齐、垂直对齐、自动换行等)
  4. 保存文件
python 复制代码
# -*- coding: utf-8 -*-
"""
================================================================================
第2章/对齐方式演示
================================================================================
开发思路:
1. 创建工作簿
2. 设置行列尺寸以便展示效果
3. 创建各种对齐方式示例(水平对齐、垂直对齐、自动换行等)
4. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入Font和Alignment类
from openpyxl.styles import Font, Alignment

# 导入os模块处理文件路径
import os


def demonstrate_alignment_styles():
  """
  演示各种对齐方式
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "对齐方式演示"

  # 设置行列尺寸
  ws.column_dimensions['A'].width = 15
  ws.column_dimensions['B'].width = 20

  # 标题
  ws['A1'] = '对齐方式'
  ws['B1'] = '示例'
  ws['A1'].font = Font(bold=True)
  ws['B1'].font = Font(bold=True)

  # 各种对齐方式
  alignments = [
    ('左上', Alignment(horizontal='left', vertical='top')),
    ('左中', Alignment(horizontal='left', vertical='center')),
    ('左下', Alignment(horizontal='left', vertical='bottom')),
    ('中上', Alignment(horizontal='center', vertical='top')),
    ('居中', Alignment(horizontal='center', vertical='center')),
    ('中下', Alignment(horizontal='center', vertical='bottom')),
    ('右上', Alignment(horizontal='right', vertical='top')),
    ('右中', Alignment(horizontal='right', vertical='center')),
    ('右下', Alignment(horizontal='right', vertical='bottom')),
    ('自动换行', Alignment(wrap_text=True)),
    ('缩小适应', Alignment(shrink_to_fit=True)),
  ]

  for row, (desc, align) in enumerate(alignments, start=2):
    ws.cell(row=row, column=1, value=desc)
    cell = ws.cell(row=row, column=2, value='这是一段很长的示例文本用于演示对齐效果')
    cell.alignment = align
    ws.row_dimensions[row].height = 30

  # 保存
  output_dir = os.path.join(os.path.dirname(__file__), "output")
  os.makedirs(output_dir, exist_ok=True)
  file_path = os.path.join(output_dir, "对齐方式演示.xlsx")
  wb.save(file_path)

  print(f"对齐方式演示文件已保存: {file_path}")
  wb.close()


# 如果这个脚本被直接运行(不是被导入),则执行以下代码
if __name__ == "__main__":
  demonstrate_alignment_styles()
📊 知识图谱

对齐方式系统
Alignment对齐类
水平对齐
垂直对齐
特殊选项
horizontal

left左对齐
horizontal

center居中
horizontal

right右对齐
vertical

top顶部
vertical

center居中
vertical

bottom底部
wrap_text

自动换行
shrink_to_fit

缩小适应
左上

left+top
左中

left+center
左下

left+bottom
中上

center+top
居中

center+center
中下

center+bottom
右上

right+top
右中

right+center
右下

right+bottom

📊 代码执行时序图

文件系统 Cell对象 Alignment类 Workbook类 Python脚本 用户 文件系统 Cell对象 Alignment类 Workbook类 Python脚本 用户 loop [遍历11种对齐方式] 运行脚本 创建工作簿 返回wb对象 wb.active获取工作表 返回ws对象 设置列宽和行高 写入表头 应用粗体样式 创建Alignment对象 返回对齐样式 写入对齐方式描述 写入示例文本 cell.alignment应用样式 设置行高30 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息

🖨️ 代码运行效果

运行上述代码后,会生成一个名为 对齐方式演示.xlsx 的Excel文件,效果如下:

📊 对齐方式效果展示

对齐方式说明:

对齐方式 horizontal vertical 效果描述
左上 left top 文字靠左上方对齐
左中 left center 文字靠左垂直居中
左下 left bottom 文字靠左下方对齐
中上 center top 文字水平居中靠上
居中 center center 文字水平和垂直都居中
中下 center bottom 文字水平居中靠下
右上 right top 文字靠右上方对齐
右中 right center 文字靠右垂直居中
右下 right bottom 文字靠右下方对齐
自动换行 - - 文字超出单元格宽度时自动换行
缩小适应 - - 文字自动缩小以适应单元格宽度

💡 Alignment参数说明

  • horizontal:水平对齐(left/center/right)
  • vertical:垂直对齐(top/center/bottom)
  • wrap_text:自动换行(True/False)
  • shrink_to_fit:缩小适应(True/False)
📁 生成的文件结构
复制代码
openpyxl_tutorial/
├── chapter_02_formatting/
│   ├── demonstrate_alignment_styles.py  # 演示脚本
└── output/
    └── 对齐方式演示.xlsx                 # 生成的Excel文件

2.8 本章知识总结 📝

第2章 单元格样式
字体 Font
填充 Fill
边框 Border
对齐 Alignment
数字格式
条件格式
name 字体名称
size 字号
bold 粗体
color 颜色
start_color 起始色
fill_type 填充类型
Side 边框线
left/right/top/bottom
horizontal 水平对齐
vertical 垂直对齐
wrap_text 自动换行
#,##0 千分位
0.0% 百分比
yyyy-mm-dd 日期
ColorScaleRule 色阶
DataBarRule 数据条
IconSetRule 图标集

本章重点回顾

样式类型 关键类/属性 常用设置
字体 Font() name, size, bold, italic, color
填充 PatternFill() start_color, fill_type='solid'
边框 Border() + Side() style, color
对齐 Alignment() horizontal, vertical, wrap_text
数字格式 cell.number_format #,##0 / 0.0% / yyyy-mm-dd
条件格式 ColorScaleRule() start_color, mid_color, end_color

下一章预告:我们将学习工作表的高级操作,包括多工作表管理、行列操作等!


相关推荐
tryCbest2 小时前
Pip生成requirements.txt文件
python·pip
张健11564096482 小时前
QT创建线程
开发语言·qt
鲸渔2 小时前
【C++ 输入输出】cin、cout、cerr 与格式化输出
开发语言·c++·算法
3GPP仿真实验室2 小时前
【MATLAB源码】水声:时变信道估计仿真平台
开发语言·matlab
froginwe112 小时前
Eclipse 关闭项目详解
开发语言
wjs20242 小时前
《jQuery Validate》深度解析与应用指南
开发语言
橘子编程2 小时前
编程语言全指南:从C到Rust
java·c语言·开发语言·c++·python·rust·c#
ego.iblacat2 小时前
Flask 框架
后端·python·flask
我送炭你添花2 小时前
边走边聊 Python 3.8:Win7 从入门到高手(目录)
开发语言·python