第6章 高级应用 - 解锁更多可能性

6.1 本章学习目标

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

  1. 图片插入:在Excel中插入图片并调整大小位置
  2. 超链接与批注:添加可点击链接和单元格说明
  3. 数据验证:创建下拉列表和输入限制
  4. 筛选与排序:添加自动筛选和数据排序功能
  5. 打印设置:配置页面布局、页眉页脚和打印区域

6.2 为什么要学习高级功能?

🌟 生活类比:你已经学会了开车(基础操作),现在要学习在高速公路上超车、夜间驾驶、应对恶劣天气(高级技巧)。这些技能让你在复杂场景下游刃有余。

openpyxl高级功能的优势:

  • 处理复杂数据:数据透视表、筛选、排序
  • 丰富文档内容:插入图片、超链接、批注
  • 自动化处理:批量操作、模板生成
  • 数据验证:限制输入、下拉列表

6.3 高级功能概览

openpyxl高级功能

数据透视表

图片插入

超链接

批注

数据验证

筛选与排序

打印设置

PivotTable

数据汇总分析

insert_image

调整大小位置

Hyperlink

内部外部链接

Comment

添加说明

DataValidation

下拉列表

输入限制

AutoFilter

排序

页面设置

打印区域

6.4 实例1:图片插入与处理 🖼️

📁 代码路径: openpyxl-tutorial/chapter_06_advanced/insert_images.py

📝 场景:学习如何在Excel中插入图片,并调整图片的大小和位置

📝 开发思路

  1. 创建工作簿并填充数据
  2. 插入本地图片
  3. 调整图片大小和位置
  4. 保存文件
# -*- coding: utf-8 -*-
"""
================================================================================
第6章/图片插入与处理
================================================================================
开发思路:
1. 创建工作簿并填充数据
2. 插入本地图片
3. 调整图片大小和位置
4. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入图片处理类
from openpyxl.drawing.image import Image as XLImage

# 导入样式相关类
from openpyxl.styles import Font, PatternFill, Alignment

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


def insert_images_demo():
  """
  演示图片插入功能
  注意:需要安装PIL库(pillow)来处理图片
  pip install pillow
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "图片插入演示"

  # ==================== 1. 填充数据 ====================
  ws['A1'] = '产品展示'
  ws['A1'].font = Font(size=16, bold=True)

  ws['A3'] = '产品名称:'
  ws['B3'] = '智能手表 Pro'
  ws['A4'] = '产品价格:'
  ws['B4'] = '¥2,999'
  ws['A5'] = '产品描述:'
  ws['B5'] = '高端智能手表,支持心率监测、GPS定位'

  # ==================== 2. 使用同目录下的logo.png图片 ====================
  # 获取脚本所在目录
  script_dir = os.path.dirname(__file__)
  # 构建logo.png的完整路径
  img_path = os.path.join(script_dir, "logo.png")
  
  # 检查图片是否存在
  if not os.path.exists(img_path):
    print(f"警告: 未找到图片文件: {img_path}")
    print("请确保logo.png文件与脚本在同一目录下")
    img_path = None

  # ==================== 3. 插入图片 ====================
  if img_path and os.path.exists(img_path):
    # 创建图片对象
    img = XLImage(img_path)

    # 使用原图片的宽高比,只设置最大宽度,高度按比例缩放
    max_width = 200
    # 计算缩放比例,保持宽高比
    scale = max_width / img.width
    img.width = max_width
    img.height = int(img.height * scale)

    # 插入图片到指定单元格
    ws.add_image(img, 'D3')

    print(f"图片已插入到单元格 D3,尺寸: {img.width} x {img.height}")

  # ==================== 4. 添加使用说明 ====================
  ws['A8'] = '图片插入说明:'
  ws['A8'].font = Font(bold=True)
  ws['A9'] = '1. 使用 from openpyxl.drawing.image import Image'
  ws['A10'] = '2. 创建图片对象: img = Image(图片路径)'
  ws['A11'] = '3. 调整大小: img.width = 200'
  ws['A12'] = '4. 插入图片: ws.add_image(img, "D3")'
  ws['A13'] = '注意:需要安装 pillow 库: pip install pillow'

  # ==================== 5. 保存文件 ====================
  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}")

  wb.close()
  return file_path


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

📊 知识图谱

图片插入系统

需要

图片插入

准备图片

创建图片对象

调整图片属性

添加到工作表

本地图片文件
png/jpg/gif

XLImage类
from openpyxl.drawing.image

width宽度

height高度

anchor锚点位置

ws.add_image
指定单元格位置

依赖库

Pillow
pip install pillow

📊 代码执行时序图
文件系统 XLImage类 Workbook类 Python脚本 用户 文件系统 XLImage类 Workbook类 Python脚本 用户 运行脚本 创建工作簿 返回wb对象 填充产品数据 创建图片对象 XLImage(image_path) 返回img对象 设置图片宽度 img.width = 200 设置图片高度 img.height = 150 ws.add_image(img, "D3") 添加图片到单元格 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息
🖨️ 代码运行效果

运行上述代码后,会生成一个名为 图片插入演示.xlsx 的Excel文件,其中包含插入的图片:

图片插入与处理

📊 图片插入效果
属性 设置值 说明
图片宽度 200 像素单位
图片高度 150 像素单位
图片位置 D3单元格 锚点位置

图片插入要点:

步骤 代码 说明
导入类 from openpyxl.drawing.image import Image 导入图片处理类
创建对象 img = Image(image_path) 加载图片文件
调整大小 img.width = 200 设置宽度
调整大小 img.height = 150 设置高度
添加图片 ws.add_image(img, "D3") 添加到指定单元格

⚠️ 依赖安装:使用图片功能前需要安装Pillow库:pip install pillow

📁 生成的文件结构
openpyxl_tutorial/
├── chapter_06_advanced/
│   ├── insert_images.py           # 演示脚本
│   └── product.png                # 示例图片
└── output/
    └── 图片插入演示.xlsx            # 生成的Excel文件

6.5 实例2:超链接与批注 🔗

📁 代码路径: openpyxl-tutorial/chapter_06_advanced/hyperlinks_and_comments.py

📝 场景:学习如何在单元格中添加超链接和批注

📝 开发思路

  1. 创建工作簿并填充数据
  2. 添加外部超链接(网址)
  3. 添加内部超链接(工作表间跳转)
  4. 添加批注
  5. 保存文件
# -*- coding: utf-8 -*-
"""
================================================================================
第6章/超链接与批注
================================================================================
开发思路:
1. 创建工作簿并填充数据
2. 添加外部超链接(网址)
3. 添加内部超链接(工作表间跳转)
4. 添加批注
5. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入批注类
from openpyxl.comments import Comment

# 导入样式相关类
from openpyxl.styles import Font, colors

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


def hyperlinks_and_comments_demo():
  """
  演示超链接和批注功能
  """
  wb = Workbook()

  # ==================== 1. 创建第一个工作表 ====================
  ws1 = wb.active
  ws1.title = "超链接演示"

  ws1['A1'] = '超链接与批注演示'
  ws1['A1'].font = Font(size=16, bold=True)

  # 外部超链接(网址)
  ws1['A3'] = '外部链接示例:'
  ws1['A3'].font = Font(bold=True)

  # 使用HYPERLINK公式创建可点击的超链接
  ws1['B3'] = '=HYPERLINK("https://www.baidu.com", "访问百度")'
  ws1['B3'].font = Font(color='0563C1', underline='single')

  ws1['B4'] = '=HYPERLINK("https://www.python.org", "访问Python官网")'
  ws1['B4'].font = Font(color='0563C1', underline='single')

  ws1['B5'] = '=HYPERLINK("https://openpyxl.readthedocs.io", "访问openpyxl文档")'
  ws1['B5'].font = Font(color='0563C1', underline='single')

  # 内部超链接(工作表间跳转)
  ws1['A7'] = '内部链接示例:'
  ws1['A7'].font = Font(bold=True)

  # 创建第二个工作表
  ws2 = wb.create_sheet("详细信息")
  ws2['A1'] = '这是详细信息页面'
  ws2['A1'].font = Font(size=14, bold=True)
  ws2['A3'] = '这里可以放置更多详细信息...'

  # 添加跳转到第二个工作表的链接(内部链接使用 HYPERLINK 公式)
  ws1['B7'] = '=HYPERLINK("#详细信息!A1", "跳转到详细信息")'
  ws1['B7'].font = Font(color='0563C1', underline='single')

  # 在第二个工作表添加返回链接
  ws2['A5'] = '=HYPERLINK("#超链接演示!A1", "返回主页面")'
  ws2['A5'].font = Font(color='0563C1', underline='single')

  # ==================== 2. 添加批注 ====================
  ws1['A9'] = '批注示例:'
  ws1['A9'].font = Font(bold=True)

  # 添加带批注的单元格
  ws1['B9'] = '鼠标悬停查看批注'

  # 创建批注
  comment = Comment('这是一个批注示例!\n批注可以包含多行文本。', '作者:Admin')
  ws1['B9'].comment = comment

  # 另一个批注示例
  ws1['B10'] = '重要数据'
  comment2 = Comment('这个数据需要特别注意,每月更新。', '作者:Manager')
  ws1['B10'].comment = comment2

  # ==================== 3. 添加使用说明 ====================
  ws1['A12'] = '使用说明:'
  ws1['A12'].font = Font(bold=True)
  ws1['A13'] = '• 超链接:=HYPERLINK("URL", "显示文本")'
  ws1['A14'] = '• 外部链接:=HYPERLINK("https://...", "文本")'
  ws1['A15'] = '• 内部链接:=HYPERLINK("#工作表名!单元格", "文本")'
  ws1['A16'] = '• 批注:cell.comment = Comment(文本, 作者)'

  # ==================== 4. 保存文件 ====================
  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(f"\n包含内容:")
  print("  - 外部超链接(百度、Python官网、openpyxl文档)")
  print("  - 内部超链接(工作表间跳转)")
  print("  - 单元格批注")

  wb.close()
  return file_path


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

📊 知识图谱

超链接与批注系统

应用

超链接

外部链接

内部链接

HYPERLINK公式
网址链接

百度/Python官网
openpyxl文档

HYPERLINK公式
#工作表名!单元格

工作表间跳转
主页面↔详细信息

批注

Comment类

批注内容

作者信息

样式设置

蓝色字体

下划线

📊 代码执行时序图
文件系统 Comment类 Workbook类 Python脚本 用户 文件系统 Comment类 Workbook类 Python脚本 用户 运行脚本 创建工作簿 返回wb对象 创建超链接演示表 写入外部超链接公式 =HYPERLINK("https://...") 设置链接样式(蓝色+下划线) 创建详细信息表 写入内部超链接公式 =HYPERLINK(" 添加返回链接 创建批注对象 Comment(文本, 作者) 返回comment对象 cell.comment = comment 添加批注到单元格 添加使用说明 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息
🖨️ 代码运行效果

运行上述代码后,会生成一个名为 超链接与批注.xlsx 的Excel文件,包含2个工作表:

📊 超链接与批注效果
工作表 内容 类型
超链接演示 外部链接、内部链接、批注 主页面
详细信息 返回链接 子页面

超链接语法:

类型 公式 示例
外部链接 =HYPERLINK("URL", "显示文本") =HYPERLINK("https://www.baidu.com", "访问百度")
内部链接 =HYPERLINK("#工作表名!单元格", "显示文本") =HYPERLINK("#详细信息!A1", "跳转到详细信息")

批注语法:

步骤 代码 说明
导入类 from openpyxl.comments import Comment 导入批注类
创建批注 Comment(文本, 作者) 创建批注对象
添加批注 cell.comment = comment 将批注添加到单元格

链接样式:

样式 代码 效果
蓝色字体 Font(color='0563C1') 链接默认颜色
下划线 Font(underline='single') 链接下划线
📁 生成的文件结构
openpyxl_tutorial/
├── chapter_06_advanced/
│   ├── hyperlinks_and_comments.py  # 演示脚本
└── output/
    └── 超链接与批注.xlsx             # 生成的Excel文件

6.6 实例3:数据验证 📋

📁 代码路径: openpyxl-tutorial/chapter_06_advanced/data_validation_demo.py

📝 场景:学习如何使用数据验证限制单元格输入,创建下拉列表

📝 开发思路

  1. 创建工作簿
  2. 创建下拉列表(数据验证)
  3. 创建数值范围限制
  4. 创建日期限制
  5. 保存文件
# -*- coding: utf-8 -*-
"""
================================================================================
第6章/数据验证演示
================================================================================
开发思路:
1. 创建工作簿
2. 创建下拉列表(数据验证)
3. 创建数值范围限制
4. 创建日期限制
5. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入数据验证类
from openpyxl.worksheet.datavalidation import DataValidation

# 导入样式相关类
from openpyxl.styles import Font, PatternFill

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


def data_validation_demo():
  """
  演示数据验证功能
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "数据验证"

  # ==================== 1. 设置标题 ====================
  ws['A1'] = '数据验证演示'
  ws['A1'].font = Font(size=16, bold=True)

  # ==================== 2. 下拉列表示例 ====================
  ws['A3'] = '部门选择(下拉列表):'
  ws['A3'].font = Font(bold=True)

  # 创建下拉列表数据验证
  # DataValidation 类用于创建数据验证规则
  dv_dept = DataValidation(
    type="list",  # 类型为列表
    formula1='"技术部,市场部,销售部,人事部,财务部"',  # 列表选项
    allow_blank=True  # 允许空值
  )

  # 设置提示信息
  dv_dept.prompt = '请选择部门'
  dv_dept.promptTitle = '部门选择'

  # 添加数据验证到工作表
  ws.add_data_validation(dv_dept)

  # 将数据验证应用到单元格
  dv_dept.add(ws['B3'])
  ws['B3'].fill = PatternFill(start_color='FFF2CC', fill_type='solid')

  # ==================== 3. 数值范围限制 ====================
  ws['A5'] = '年龄输入(18-60岁):'
  ws['A5'].font = Font(bold=True)

  # 创建数值范围验证
  dv_age = DataValidation(
    type="whole",  # 整数类型
    operator="between",  # 介于两者之间
    formula1=18,  # 最小值
    formula2=60,  # 最大值
    allow_blank=True
  )

  dv_age.error = '年龄必须在18-60岁之间'
  dv_age.errorTitle = '输入错误'
  dv_age.prompt = '请输入18-60之间的整数'
  dv_age.promptTitle = '年龄输入'

  ws.add_data_validation(dv_age)
  dv_age.add(ws['B5'])
  ws['B5'].fill = PatternFill(start_color='FFF2CC', fill_type='solid')

  # ==================== 4. 日期限制 ====================
  ws['A7'] = '入职日期(2024年内):'
  ws['A7'].font = Font(bold=True)

  # 创建日期范围验证
  dv_date = DataValidation(
    type="date",
    operator="between",
    formula1="2024-01-01",
    formula2="2024-12-31",
    allow_blank=True
  )

  dv_date.error = '日期必须在2024年内'
  dv_date.errorTitle = '日期错误'
  dv_date.prompt = '请选择2024年内的日期'
  dv_date.promptTitle = '入职日期'

  ws.add_data_validation(dv_date)
  dv_date.add(ws['B7'])
  ws['B7'].fill = PatternFill(start_color='FFF2CC', fill_type='solid')

  # ==================== 5. 文本长度限制 ====================
  ws['A9'] = '手机号(11位):'
  ws['A9'].font = Font(bold=True)

  # 创建文本长度验证
  dv_phone = DataValidation(
    type="textLength",
    operator="equal",
    formula1=11,
    allow_blank=True
  )

  dv_phone.error = '手机号必须是11位数字'
  dv_phone.errorTitle = '格式错误'

  ws.add_data_validation(dv_phone)
  dv_phone.add(ws['B9'])
  ws['B9'].fill = PatternFill(start_color='FFF2CC', fill_type='solid')

  # ==================== 6. 自定义公式验证 ====================
  ws['A11'] = '邮箱格式:'
  ws['A11'].font = Font(bold=True)

  # 创建自定义公式验证(简单的邮箱格式检查)
  dv_email = DataValidation(
    type="custom",
    formula1='=ISNUMBER(SEARCH("@",B11))',
    allow_blank=True
  )

  dv_email.error = '请输入有效的邮箱地址(包含@符号)'
  dv_email.errorTitle = '格式错误'

  ws.add_data_validation(dv_email)
  dv_email.add(ws['B11'])
  ws['B11'].fill = PatternFill(start_color='FFF2CC', fill_type='solid')

  # ==================== 7. 添加使用说明 ====================
  ws['A13'] = '数据验证类型:'
  ws['A13'].font = Font(bold=True)
  ws['A14'] = '• list - 下拉列表'
  ws['A15'] = '• whole - 整数'
  ws['A16'] = '• decimal - 小数'
  ws['A17'] = '• date - 日期'
  ws['A18'] = '• textLength - 文本长度'
  ws['A19'] = '• custom - 自定义公式'

  # ==================== 8. 保存文件 ====================
  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(f"\n包含验证:")
  print("  - 下拉列表(部门选择)")
  print("  - 数值范围(年龄18-60)")
  print("  - 日期范围(2024年内)")
  print("  - 文本长度(手机号11位)")
  print("  - 自定义公式(邮箱格式)")

  wb.close()
  return file_path


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

📊 知识图谱

数据验证系统

DataValidation

验证类型

验证规则

提示信息

list列表
下拉选择

whole整数
范围限制

date日期
日期范围

textLength文本长度

custom自定义公式

operator操作符
between/equal

formula1最小值/公式

formula2最大值

prompt提示

error错误提示

allow_blank允许空值

应用流程

创建DataValidation

ws.add_data_validation

dv.add应用到单元格

📊 代码执行时序图
文件系统 DataValidation类 Workbook类 Python脚本 用户 文件系统 DataValidation类 Workbook类 Python脚本 用户 运行脚本 创建工作簿 返回wb对象 创建下拉列表验证 type="list" 返回dv对象 设置prompt提示信息 ws.add_data_validation(dv) dv.add(ws['B3'])应用 创建数值范围验证 type="whole" 设置operator="between" 设置formula1=18, formula2=60 ws.add_data_validation(dv) dv.add(ws['B5'])应用 创建日期范围验证 type="date" 创建文本长度验证 type="textLength" 创建自定义公式验证 type="custom" 添加使用说明 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息
🖨️ 代码运行效果

运行上述代码后,会生成一个名为 数据验证演示.xlsx 的Excel文件,包含5种数据验证:

📊 数据验证效果
验证项 类型 规则 提示信息
部门选择 list 技术部,市场部,销售部,人事部,财务部 请选择部门
年龄输入 whole between 18-60 年龄必须在18-60岁之间
入职日期 date 2024年内 日期必须在2024年内
手机号 textLength 等于11位 手机号必须是11位数字
邮箱格式 custom 包含@符号 请输入有效的邮箱地址

DataValidation参数:

参数 说明 示例
type 验证类型 "list", "whole", "date"
operator 操作符 "between", "equal"
formula1 公式/最小值 18, "2024-01-01"
formula2 最大值 60, "2024-12-31"
allow_blank 允许空值 True/False

验证类型:

类型 用途
list 下拉列表选择
whole 整数范围限制
decimal 小数范围限制
date 日期范围限制
textLength 文本长度限制
custom 自定义公式验证
📁 生成的文件结构
openpyxl_tutorial/
├── chapter_06_advanced/
│   ├── data_validation_demo.py    # 演示脚本
└── output/
    └── 数据验证演示.xlsx             # 生成的Excel文件

6.7 实例4:筛选与排序 🔍

📁 代码路径: openpyxl-tutorial/chapter_06_advanced/filter_and_sort.py

📝 场景:学习如何添加自动筛选和排序功能

📝 开发思路

  1. 创建工作簿并填充数据
  2. 添加自动筛选
  3. 演示排序功能
  4. 保存文件
# -*- coding: utf-8 -*-
"""
================================================================================
第6章/筛选与排序
================================================================================
开发思路:
1. 创建工作簿并填充数据
2. 添加自动筛选
3. 演示排序功能
4. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入样式相关类
from openpyxl.styles import Font, PatternFill

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


def filter_and_sort_demo():
  """
  演示筛选与排序功能
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "筛选与排序"

  # ==================== 1. 填充数据 ====================
  ws['A1'] = '员工信息表(支持筛选)'
  ws['A1'].font = Font(size=16, bold=True)

  # 表头
  headers = ['姓名', '部门', '职位', '年龄', '工资', '入职日期']
  header_fill = PatternFill(start_color='5B9BD5', fill_type='solid')
  header_font = Font(bold=True, color='FFFFFF')

  for col, header in enumerate(headers, 1):
    cell = ws.cell(row=3, column=col, value=header)
    cell.font = header_font
    cell.fill = header_fill

  # 员工数据
  employees = [
    ['张三', '技术部', '工程师', 28, 15000, '2020-03-15'],
    ['李四', '技术部', '高级工程师', 32, 20000, '2019-06-20'],
    ['王五', '市场部', '经理', 35, 18000, '2018-01-10'],
    ['赵六', '市场部', '专员', 25, 8000, '2021-09-05'],
    ['钱七', '销售部', '销售主管', 30, 16000, '2017-11-22'],
    ['孙八', '人事部', 'HR专员', 27, 9000, '2022-04-18'],
    ['周九', '财务部', '会计', 29, 11000, '2020-07-12'],
    ['吴十', '技术部', '工程师', 26, 14000, '2021-03-08'],
  ]

  for row_idx, emp_data in enumerate(employees, start=4):
    for col_idx, value in enumerate(emp_data, 1):
      ws.cell(row=row_idx, column=col_idx, value=value)

  # ==================== 2. 添加自动筛选 ====================
  # auto_filter 属性用于设置自动筛选范围
  ws.auto_filter.ref = ws.dimensions
  # 或者指定具体范围
  # ws.auto_filter.ref = "A3:F11"

  print("自动筛选已添加到表头")

  # ==================== 3. 添加使用说明 ====================
  ws['H3'] = '使用说明:'
  ws['H3'].font = Font(bold=True)
  ws['H4'] = '1. 点击表头的下拉箭头可以筛选数据'
  ws['H5'] = '2. 可以按部门、职位等条件筛选'
  ws['H6'] = '3. 可以按工资、年龄排序'
  ws['H7'] = '4. 支持多条件组合筛选'

  ws['H9'] = 'openpyxl代码:'
  ws['H9'].font = Font(bold=True)
  ws['H10'] = 'ws.auto_filter.ref = "A3:F11"'

  # ==================== 4. 保存文件 ====================
  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(f"\n功能说明:")
  print("  - 表头已启用自动筛选")
  print("  - 可以在Excel中点击下拉箭头进行筛选和排序")

  wb.close()
  return file_path


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

📊 知识图谱

筛选与排序系统

启用

自动筛选

设置筛选范围

表头样式

ws.auto_filter.ref

ws.dimensions
自动检测范围

指定范围
A3:F11

背景色

字体颜色

加粗

数据准备

表头行

数据行

Excel功能

下拉筛选

条件筛选

排序

📊 代码执行时序图
文件系统 Workbook类 Python脚本 用户 文件系统 Workbook类 Python脚本 用户 loop [填充8名员工数据] 运行脚本 创建工作簿 返回wb对象 设置表头样式 背景色+白色字体+加粗 写入员工信息 姓名/部门/职位/年龄/工资/入职日期 ws.auto_filter.ref = ws.dimensions 添加自动筛选 添加使用说明 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息
🖨️ 代码运行效果

运行上述代码后,会生成一个名为 筛选与排序.xlsx 的Excel文件,表头已启用自动筛选功能:

📊 筛选与排序效果
功能 说明 代码
自动筛选 表头添加下拉箭头 ws.auto_filter.ref = ws.dimensions
指定范围 手动设置筛选范围 ws.auto_filter.ref = "A3:F11"

表头样式:

属性 设置值 效果
背景色 5B9BD5 蓝色背景
字体颜色 FFFFFF 白色字体
字体 bold=True 加粗

数据表示例:

姓名 部门 职位 年龄 工资 入职日期
张三 技术部 工程师 28 15000 2020-03-15
李四 技术部 高级工程师 32 20000 2019-06-20

💡 使用说明:在Excel中打开文件后,点击表头的下拉箭头可以进行筛选和排序操作。

📁 生成的文件结构
openpyxl_tutorial/
├── chapter_06_advanced/
│   ├── filter_and_sort.py         # 演示脚本
└── output/
    └── 筛选与排序.xlsx              # 生成的Excel文件

6.8 实例5:打印设置 🖨️

📁 代码路径: openpyxl-tutorial/chapter_06_advanced/print_settings.py

📝 场景:学习如何设置打印页面、打印区域等

📝 开发思路

  1. 创建工作簿并填充数据
  2. 设置页面方向(横向/纵向)
  3. 设置打印区域
  4. 设置页眉页脚
  5. 保存文件
# -*- coding: utf-8 -*-
"""
================================================================================
第6章/打印设置
================================================================================
开发思路:
1. 创建工作簿并填充数据
2. 设置页面方向(横向/纵向)
3. 设置打印区域
4. 设置页眉页脚
5. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入页面设置相关类
from openpyxl.worksheet.page import PageMargins

# 导入样式相关类
from openpyxl.styles import Font

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


def print_settings_demo():
  """
  演示打印设置功能
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "打印设置"

  # ==================== 1. 填充数据 ====================
  ws['A1'] = '打印设置演示'
  ws['A1'].font = Font(size=16, bold=True)

  # 创建一些示例数据
  for row in range(3, 20):
    for col in range(1, 8):
      ws.cell(row=row, column=col, value=f'数据{row}-{col}')

  # ==================== 2. 设置页面方向 ====================
  # page_setup 用于设置页面属性
  ws.page_setup.orientation = 'landscape'  # landscape=横向,portrait=纵向
  ws.page_setup.paperSize = 9  # 9 = A4

  print("页面方向设置为:横向")

  # ==================== 3. 设置打印区域 ====================
  # print_area 用于设置打印区域
  ws.print_area = 'A1:G15'
  print("打印区域设置为:A1:G15")

  # ==================== 4. 设置页边距 ====================
  ws.page_margins = PageMargins(
    left=0.5,  # 左边距(英寸)
    right=0.5,  # 右边距
    top=0.75,  # 上边距
    bottom=0.75,  # 下边距
    header=0.3,  # 页眉距离
    footer=0.3  # 页脚距离
  )

  # ==================== 5. 设置页眉页脚 ====================
  # 奇偶页不同的设置
  ws.oddHeader.center.text = "公司机密文件"
  ws.oddHeader.center.size = 14
  ws.oddHeader.center.font = "微软雅黑"

  ws.oddFooter.center.text = "第 &[Page] 页,共 &[Pages] 页"
  ws.oddFooter.center.size = 10

  print("页眉页脚已设置")

  # ==================== 6. 设置打印标题行 ====================
  # print_title_rows 用于设置每页重复打印的标题行
  ws.print_title_rows = '1:1'  # 第一行作为标题行
  print("打印标题行设置为:第1行")

  # ==================== 7. 其他打印选项 ====================
  ws.print_options.gridLines = False  # 不打印网格线
  ws.print_options.horizontalCentered = True  # 水平居中
  ws.print_options.verticalCentered = False  # 不垂直居中

  # ==================== 8. 添加使用说明 ====================
  ws['I3'] = '打印设置说明:'
  ws['I3'].font = Font(bold=True)
  ws['I4'] = '• 页面方向:横向'
  ws['I5'] = '• 纸张大小:A4'
  ws['I6'] = '• 打印区域:A1:G15'
  ws['I7'] = '• 页眉:公司机密文件'
  ws['I8'] = '• 页脚:第X页,共Y页'
  ws['I9'] = '• 标题行:第1行(每页重复)'

  # ==================== 9. 保存文件 ====================
  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(f"\n打印设置:")
  print("  - 页面方向:横向")
  print("  - 打印区域:A1:G15")
  print("  - 页眉:公司机密文件")
  print("  - 页脚:第X页,共Y页")

  wb.close()
  return file_path


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

📊 知识图谱

打印设置系统

打印设置

页面设置

打印区域

页边距

页眉页脚

打印选项

orientation方向
landscape横向

paperSize纸张
9=A4

print_area
A1:G15

PageMargins

left/right
top/bottom

header/footer

oddHeader
奇数页页眉

oddFooter
奇数页页脚

center.text
居中内容

print_title_rows
标题行重复

gridLines
网格线

horizontalCentered
水平居中

📊 代码执行时序图
文件系统 PageMargins类 Workbook类 Python脚本 用户 文件系统 PageMargins类 Workbook类 Python脚本 用户 运行脚本 创建工作簿 返回wb对象 填充示例数据 ws.page_setup.orientation = 'landscape' 设置横向 ws.page_setup.paperSize = 9 设置A4纸张 ws.print_area = 'A1:G15' 设置打印区域 创建PageMargins对象 返回margins对象 ws.page_margins = margins 设置页边距 ws.oddHeader.center.text 设置页眉 ws.oddFooter.center.text 设置页脚 ws.print_title_rows = '1:1' 设置标题行 ws.print_options.gridLines = False 不打印网格线 添加使用说明 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息
🖨️ 代码运行效果

运行上述代码后,会生成一个名为 打印设置.xlsx 的Excel文件,已配置完整的打印设置:

📊 打印设置效果
设置项 说明
页面方向 landscape 横向
纸张大小 9 A4
打印区域 A1:G15 指定范围
左边距 0.5英寸 页边距
右边距 0.5英寸 页边距
上边距 0.75英寸 页边距
下边距 0.75英寸 页边距
页眉 公司机密文件 居中显示
页脚 第X页,共Y页 居中显示
标题行 1:1 每页重复
网格线 False 不打印

打印设置要点:

设置类别 属性 示例
页面方向 ws.page_setup.orientation 'landscape'横向/'portrait'纵向
纸张大小 ws.page_setup.paperSize 9=A4
打印区域 ws.print_area 'A1:G15'
页边距 ws.page_margins PageMargins(left=0.5, ...)
页眉 ws.oddHeader.center.text 设置居中页眉内容
页脚 ws.oddFooter.center.text 设置居中页脚内容
标题行 ws.print_title_rows '1:1'第一行重复

页眉页脚变量:

变量 说明
&[Page] 当前页码
&[Pages] 总页数
&[Date] 当前日期
&[Time] 当前时间
&[File] 文件名
&[Tab] 工作表名
📁 生成的文件结构
openpyxl_tutorial/
├── chapter_06_advanced/
│   ├── print_settings.py          # 演示脚本
└── output/
    └── 打印设置.xlsx                # 生成的Excel文件

6.9 本章知识总结 📝

第6章 高级应用

图片插入

超链接

批注

数据验证

筛选排序

打印设置

Image

调整大小

hyperlink

外部/内部链接

Comment

作者/内容

DataValidation

list/whole/date

auto_filter

page_setup

print_area

页眉页脚

本章重点回顾

功能 关键类/属性 示例
图片插入 Image(图片路径) ws.add_image(img, 'A1')
超链接 cell.hyperlink cell.hyperlink = 'https://...'
批注 Comment(文本, 作者) cell.comment = Comment(...)
下拉列表 DataValidation(type="list") dv.add(ws['A1'])
数值验证 DataValidation(type="whole") 设置formula1/formula2
自动筛选 ws.auto_filter.ref ws.auto_filter.ref = "A1:D10"
页面设置 ws.page_setup orientation = 'landscape'
打印区域 ws.print_area ws.print_area = 'A1:D10'
页眉页脚 ws.oddHeader/oddFooter 设置center.text

下一章预告:我们将通过一个综合实战案例,把所有学到的知识融会贯通!


Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐