Python办公自动化教程 - 第5章 图表创建 - 让数据可视化

第5章 图表创建 - 让数据可视化

5.1 本章学习目标

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

  1. 基础图表:柱状图、折线图、饼图的创建方法
  2. 图表样式:标题、图例、坐标轴、数据标签的定制
  3. 组合图表:多种图表类型的组合使用
  4. 动态图表:基于公式数据的动态图表创建
  5. 图表布局:图表位置、大小、颜色的调整

5.2 为什么要使用图表?

🌟 生活类比:想象你要向老板汇报公司过去一年的销售情况。是给他看密密麻麻的数字表格,还是给他看一张清晰的折线图?图表能让数据"说话",让人一眼就能看出趋势和规律。

图表的优势:

  • 直观展示:数据趋势、对比一目了然
  • 发现规律:容易发现数据中的模式和异常
  • 便于汇报:图表比纯数字更有说服力
  • 支持决策:帮助快速做出数据驱动的决策

5.3 图表类型概览

Excel图表类型
柱状图
折线图
饼图
散点图
面积图
雷达图
对比数据
分类展示
趋势分析
时间序列
占比展示
构成分析
相关性分析
分布展示
累积趋势
堆叠展示
多维对比
能力评估

5.4 实例1:销售数据可视化报表 📊

📁 代码路径 : openpyxl-tutorial/chapter_05_chart/create_sales_chart_report.py

📝 场景:创建包含多种图表的销售数据可视化报表

📝 开发思路

  1. 创建工作簿
  2. 填充销售数据
  3. 创建柱状图展示月度销售额对比
  4. 创建折线图展示销售趋势
  5. 创建饼图展示产品占比
  6. 调整图表位置和大小
  7. 保存文件
python 复制代码
# -*- coding: utf-8 -*-
"""
================================================================================
第5章/销售数据可视化报表
================================================================================
开发思路:
1. 创建工作簿
2. 填充销售数据
3. 创建柱状图展示月度销售额对比
4. 创建折线图展示销售趋势
5. 创建饼图展示产品占比
6. 调整图表位置和大小
7. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入图表相关类
from openpyxl.chart import BarChart, LineChart, PieChart, Reference

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

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


def create_sales_chart_report():
  """
  创建销售数据可视化报表
  生产场景:销售部门月度/季度数据汇报
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "销售数据"

  # ==================== 1. 填充销售数据 ====================
  # 标题
  ws.merge_cells('A1:E1')
  title_cell = ws['A1']
  title_cell.value = '2024年上半年销售数据'
  title_cell.font = Font(name='微软雅黑', size=16, bold=True, color='FFFFFF')
  title_cell.fill = PatternFill(start_color='4472C4', fill_type='solid')
  title_cell.alignment = Alignment(horizontal='center', vertical='center')
  ws.row_dimensions[1].height = 35

  # 表头
  headers = ['月份', '产品A', '产品B', '产品C', '合计']
  header_fill = PatternFill(start_color='5B9BD5', fill_type='solid')
  header_font = Font(name='微软雅黑', size=11, 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
    cell.alignment = Alignment(horizontal='center')

  # 销售数据(单位:万元)
  sales_data = [
    ['1月', 120, 85, 95],
    ['2月', 135, 92, 105],
    ['3月', 148, 98, 115],
    ['4月', 162, 105, 128],
    ['5月', 175, 118, 142],
    ['6月', 188, 125, 155],
  ]

  for row_idx, row_data in enumerate(sales_data, start=4):
    for col_idx, value in enumerate(row_data, 1):
      ws.cell(row=row_idx, column=col_idx, value=value)
    # 计算合计
    ws.cell(row=row_idx, column=5, value=f'=SUM(B{row_idx}:D{row_idx})')

  # 设置列宽
  for col in range(1, 6):
    ws.column_dimensions[chr(64 + col)].width = 12

  # ==================== 2. 创建柱状图(月度对比) ====================
  # BarChart 用于创建柱状图
  bar_chart = BarChart()
  bar_chart.type = "col"  # col=垂直柱状图,bar=水平柱状图
  bar_chart.style = 10
  bar_chart.title = "月度销售额对比"
  bar_chart.y_axis.title = '销售额(万元)'
  bar_chart.x_axis.title = '月份'

  # 设置数据范围
  # Reference(工作表, 起始列, 起始行, 结束列, 结束行)
  data = Reference(ws, min_col=2, min_row=3, max_col=4, max_row=9)
  categories = Reference(ws, min_col=1, min_row=4, max_row=9)

  bar_chart.add_data(data, titles_from_data=True)
  bar_chart.set_categories(categories)
  bar_chart.shape = 4

  # 将图表添加到工作表,位置在G3
  ws.add_chart(bar_chart, "G3")

  # ==================== 3. 创建折线图(趋势分析) ====================
  # LineChart 用于创建折线图
  line_chart = LineChart()
  line_chart.title = "销售趋势分析"
  line_chart.style = 12
  line_chart.y_axis.title = '销售额(万元)'
  line_chart.x_axis.title = '月份'

  # 添加数据
  data = Reference(ws, min_col=5, min_row=3, max_row=9)
  categories = Reference(ws, min_col=1, min_row=4, max_row=9)

  line_chart.add_data(data, titles_from_data=True)
  line_chart.set_categories(categories)

  # 将图表添加到工作表
  ws.add_chart(line_chart, "G20")

  # ==================== 4. 创建饼图(产品占比) ====================
  # 先创建产品汇总数据
  ws['H3'] = '产品'
  ws['I3'] = '总销售额'
  ws['H3'].font = Font(bold=True)
  ws['I3'].font = Font(bold=True)

  products = ['产品A', '产品B', '产品C']
  for idx, product in enumerate(products, start=4):
    ws.cell(row=idx, column=8, value=product)
    col_letter = chr(65 + idx - 3)  # B, C, D
    ws.cell(row=idx, column=9, value=f'=SUM({col_letter}4:{col_letter}9)')

  # PieChart 用于创建饼图
  pie_chart = PieChart()
  pie_chart.title = "产品销售占比"

  labels = Reference(ws, min_col=8, min_row=4, max_row=6)
  data = Reference(ws, min_col=9, min_row=3, max_row=6)

  pie_chart.add_data(data, titles_from_data=True)
  pie_chart.set_categories(labels)

  # 添加数据标签显示百分比
  from openpyxl.chart.label import DataLabelList
  pie_chart.dataLabels = DataLabelList()
  pie_chart.dataLabels.showPercent = True

  # 将图表添加到工作表
  ws.add_chart(pie_chart, "G35")

  # ==================== 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}")
  print(f"\n包含图表:")
  print("  - 柱状图:月度销售额对比")
  print("  - 折线图:销售趋势分析")
  print("  - 饼图:产品销售占比")

  wb.close()
  return file_path


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

图表创建系统
图表创建流程
准备数据
创建图表对象
配置图表属性
添加到工作表
填充销售数据

月份/产品/销售额
BarChart柱状图
LineChart折线图
PieChart饼图
设置标题
配置数据引用

Reference
设置样式属性
ws.add_chart

指定位置
柱状图
月度销售额对比
分类展示
折线图
销售趋势分析
时间序列展示
饼图
产品销售占比
构成分析

📊 代码执行时序图

文件系统 Reference类 图表类 Workbook类 Python脚本 用户 文件系统 Reference类 图表类 Workbook类 Python脚本 用户 运行脚本 创建工作簿 返回wb对象 wb.active获取工作表 返回ws对象 填充销售数据 月份、产品A-E销售额 创建BarChart柱状图 返回chart对象 创建数据引用Reference 返回data对象 chart.add_data添加数据 设置图表标题和样式 ws.add_chart添加到G3位置 创建LineChart折线图 创建趋势数据引用 配置折线图属性 ws.add_chart添加到G20位置 创建PieChart饼图 创建占比数据引用 配置饼图属性 ws.add_chart添加到G35位置 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息

🖨️ 代码运行效果

运行上述代码后,会生成一个名为 销售数据可视化报表.xlsx 的Excel文件,包含3种图表:

📊 图表效果展示
图表类型 位置 用途 数据范围
柱状图 G3 月度销售额对比 1-6月各产品销售额
折线图 G20 销售趋势分析 产品A-E销售趋势
饼图 G35 产品销售占比 各产品总销售额占比

图表配置要点:

配置项 方法 说明
图表类型 BarChart()/LineChart()/PieChart() 创建不同类型的图表
数据引用 Reference(ws, min_col, min_row, max_col, max_row) 指定图表数据源
添加数据 chart.add_data(data, titles_from_data=True) 将数据添加到图表
设置类别 chart.set_categories(categories) 设置X轴类别
图表标题 chart.title = "标题" 设置图表标题
添加到工作表 ws.add_chart(chart, "G3") 指定图表位置

数据表示例:

月份 产品A 产品B 产品C 产品D 产品E
1月 120 150 180 200 220
2月 135 165 195 215 235
... ... ... ... ... ...
📁 生成的文件结构
复制代码
openpyxl_tutorial/
├── chapter_05_chart/
│   ├── create_sales_chart_report.py    # 演示脚本
└── output/
    └── 销售数据可视化报表.xlsx            # 生成的Excel文件

5.5 实例2:图表样式定制 🎨

📁 代码路径 : openpyxl-tutorial/chapter_05_chart/customize_chart_styles.py

📝 场景:学习如何自定义图表的样式、颜色、图例等

📝 开发思路

  1. 创建工作簿并填充数据
  2. 创建基础图表
  3. 自定义图表样式(颜色、字体、图例位置)
  4. 保存文件
python 复制代码
# -*- coding: utf-8 -*-
"""
================================================================================
第5章/图表样式定制
================================================================================
开发思路:
1. 创建工作簿并填充数据
2. 创建基础图表
3. 自定义图表样式(颜色、字体、图例位置)
4. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入图表相关类
from openpyxl.chart import BarChart, Reference

# 导入图表样式类
from openpyxl.chart.shapes import GraphicalProperties
from openpyxl.drawing.line import LineProperties

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

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


def customize_chart_styles():
  """
  演示图表样式定制
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "图表样式定制"

  # ==================== 1. 填充数据 ====================
  ws['A1'] = '部门业绩对比'
  ws['A1'].font = Font(size=14, bold=True)

  # 数据
  data = [
    ['部门', 'Q1', 'Q2', 'Q3', 'Q4'],
    ['销售部', 85, 92, 88, 95],
    ['市场部', 78, 85, 90, 88],
    ['技术部', 90, 88, 92, 94],
    ['人事部', 82, 80, 85, 87],
  ]

  for row_idx, row_data in enumerate(data, start=3):
    for col_idx, value in enumerate(row_data, 1):
      ws.cell(row=row_idx, column=col_idx, value=value)

  # ==================== 2. 创建基础柱状图 ====================
  chart1 = BarChart()
  chart1.type = "col"
  chart1.title = "默认样式图表"
  chart1.style = 10

  data = Reference(ws, min_col=2, min_row=3, max_col=5, max_row=7)
  categories = Reference(ws, min_col=1, min_row=4, max_row=7)

  chart1.add_data(data, titles_from_data=True)
  chart1.set_categories(categories)

  ws.add_chart(chart1, "H3")

  # ==================== 3. 创建自定义样式图表 ====================
  chart2 = BarChart()
  chart2.type = "col"
  chart2.title = "自定义样式图表"
  chart2.style = 11

  # 设置图表尺寸
  chart2.width = 15
  chart2.height = 10

  # 添加数据
  data = Reference(ws, min_col=2, min_row=3, max_col=5, max_row=7)
  categories = Reference(ws, min_col=1, min_row=4, max_row=7)

  chart2.add_data(data, titles_from_data=True)
  chart2.set_categories(categories)

  # 设置图例位置
  chart2.legend.position = 'b'  # b=bottom, t=top, l=left, r=right

  # 设置标题字体
  from openpyxl.chart.text import RichText
  from openpyxl.drawing.text import Paragraph, ParagraphProperties, CharacterProperties

  # 自定义标题
  chart2.title = "部门季度业绩对比(定制样式)"

  ws.add_chart(chart2, "H25")

  # ==================== 4. 创建堆叠柱状图 ====================
  chart3 = BarChart()
  chart3.type = "col"
  chart3.grouping = "stacked"  # 堆叠模式
  chart3.overlap = 100
  chart3.title = "堆叠柱状图"

  data = Reference(ws, min_col=2, min_row=3, max_col=5, max_row=7)
  categories = Reference(ws, min_col=1, min_row=4, max_row=7)

  chart3.add_data(data, titles_from_data=True)
  chart3.set_categories(categories)

  ws.add_chart(chart3, "H50")

  # ==================== 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}")
  print(f"\n包含图表:")
  print("  - 默认样式图表")
  print("  - 自定义样式图表(自定义尺寸、图例位置)")
  print("  - 堆叠柱状图")

  wb.close()
  return file_path


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

图表样式定制系统
图表样式
尺寸设置
图例设置
颜色设置
图表类型变体
width宽度
height高度
legend图例对象
position位置

top/bottom/left/right
series系列颜色
graphicalProperties图形属性
默认样式柱状图
自定义样式柱状图
堆叠柱状图

grouping=stacked
样式属性
字体设置
线条属性
填充颜色

📊 代码执行时序图

文件系统 图形属性类 图表类 Workbook类 Python脚本 用户 文件系统 图形属性类 图表类 Workbook类 Python脚本 用户 运行脚本 创建工作簿 返回wb对象 填充部门业绩数据 创建默认样式BarChart chart.add_data添加数据 ws.add_chart添加到H3位置 创建自定义样式BarChart 设置width=20 height=12 配置legend.position='bottom' 创建图形属性 返回样式对象 应用自定义样式 ws.add_chart添加到H25位置 创建堆叠柱状图BarChart 设置grouping='stacked' chart.add_data添加数据 ws.add_chart添加到H50位置 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息

🖨️ 代码运行效果

运行上述代码后,会生成一个名为 图表样式定制.xlsx 的Excel文件,包含3种不同样式的图表:

📊 图表效果展示
图表 位置 样式特点
默认样式图表 H3 系统默认样式
自定义样式图表 H25 自定义尺寸、图例位置在底部
堆叠柱状图 H50 grouping='stacked'堆叠显示

样式定制要点:

定制项 属性/方法 示例
图表尺寸 width, height chart.width = 20
图例位置 legend.position chart.legend.position = 'bottom'
堆叠模式 grouping chart.grouping = 'stacked'
系列颜色 series[i].graphicalProperties 设置solidFill颜色

数据示例:

部门 Q1 Q2 Q3 Q4
销售部 85 92 88 95
市场部 78 85 90 88
技术部 90 88 92 94
人事部 82 80 85 87
📁 生成的文件结构
复制代码
openpyxl_tutorial/
├── chapter_05_chart/
│   ├── customize_chart_styles.py    # 演示脚本
└── output/
    └── 图表样式定制.xlsx              # 生成的Excel文件

5.5 实例3:组合图表 🔗

📁 代码路径 : openpyxl-tutorial/chapter_05_chart/create_combo_chart.py

📝 场景:创建柱状图和折线图的组合图表,同时展示销售额和增长率

📝 开发思路

  1. 创建工作簿并填充数据(销售额和增长率)
  2. 创建柱状图展示销售额
  3. 创建折线图展示增长率
  4. 将两个图表组合
  5. 保存文件
python 复制代码
# -*- coding: utf-8 -*-
"""
================================================================================
第5章/组合图表
================================================================================
开发思路:
1. 创建工作簿并填充数据(销售额和增长率)
2. 创建柱状图展示销售额
3. 创建折线图展示增长率
4. 将两个图表组合
5. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入图表相关类
from openpyxl.chart import BarChart, LineChart, Reference

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

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


def create_combo_chart():
  """
  创建组合图表(柱状图+折线图)
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "组合图表"

  # ==================== 1. 填充数据 ====================
  ws['A1'] = '销售额与增长率分析'
  ws['A1'].font = Font(size=14, bold=True)

  # 数据:销售额(万元)和增长率(%)
  data = [
    ['月份', '销售额', '增长率'],
    ['1月', 100, 0],
    ['2月', 120, 20],
    ['3月', 135, 12.5],
    ['4月', 158, 17],
    ['5月', 172, 8.9],
    ['6月', 195, 13.4],
  ]

  for row_idx, row_data in enumerate(data, start=3):
    for col_idx, value in enumerate(row_data, 1):
      ws.cell(row=row_idx, column=col_idx, value=value)

  # ==================== 2. 创建柱状图(销售额) ====================
  bar_chart = BarChart()
  bar_chart.type = "col"
  bar_chart.title = "销售额与增长率组合图"
  bar_chart.y_axis.title = '销售额(万元)'

  # 销售额数据
  data = Reference(ws, min_col=2, min_row=3, max_row=9)
  categories = Reference(ws, min_col=1, min_row=4, max_row=9)

  bar_chart.add_data(data, titles_from_data=True)
  bar_chart.set_categories(categories)

  # ==================== 3. 创建折线图(增长率) ====================
  line_chart = LineChart()
  line_chart.y_axis.axId = 200
  line_chart.y_axis.title = '增长率(%)'

  # 增长率数据
  data = Reference(ws, min_col=3, min_row=3, max_row=9)
  line_chart.add_data(data, titles_from_data=True)

  # 将折线图的Y轴设为次坐标轴
  line_chart.y_axis.crosses = "max"

  # ==================== 4. 组合图表 ====================
  # 将折线图叠加到柱状图上
  bar_chart += line_chart

  # 添加图表到工作表
  ws.add_chart(bar_chart, "E3")

  # ==================== 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}")
  print(f"\n组合图表说明:")
  print("  - 柱状图:展示销售额")
  print("  - 折线图:展示增长率(次坐标轴)")

  wb.close()
  return file_path


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

组合图表系统
组合图表
主图表BarChart
次图表LineChart
组合操作
柱状图

展示销售额
主Y轴

销售额万元
折线图

展示增长率
次Y轴

增长率百分比
axId=200

设置坐标轴ID
crosses=max

设为次坐标轴
bar_chart += line_chart

叠加组合
数据准备
月份数据
销售额数据
增长率数据

📊 代码执行时序图

文件系统 Reference类 折线图类 柱状图类 Workbook类 Python脚本 用户 文件系统 Reference类 折线图类 柱状图类 Workbook类 Python脚本 用户 运行脚本 创建工作簿 返回wb对象 填充数据 月份、销售额、增长率 创建BarChart柱状图 返回bar_chart对象 创建销售额数据引用 返回data对象 bar_chart.add_data添加销售额数据 设置主Y轴标题 销售额(万元) 创建LineChart折线图 返回line_chart对象 设置axId=200 独立坐标轴 创建增长率数据引用 line_chart.add_data添加增长率数据 设置次Y轴 crosses=max 设置Y轴标题 增长率(%) bar_chart += line_chart 组合图表 ws.add_chart添加到E3位置 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息

🖨️ 代码运行效果

运行上述代码后,会生成一个名为 组合图表.xlsx 的Excel文件,包含一个组合图表:

📊 组合图表效果
图表元素 类型 数据 坐标轴
柱状图 BarChart 销售额 主Y轴(左侧)
折线图 LineChart 增长率 次Y轴(右侧)

组合图表关键配置:

配置项 作用 代码示例
axId = 200 设置独立坐标轴ID line_chart.y_axis.axId = 200
crosses = "max" 设为次坐标轴 line_chart.y_axis.crosses = "max"
+= 操作 叠加组合 bar_chart += line_chart

数据示例:

月份 销售额(万元) 增长率(%)
1月 100 0
2月 120 20
3月 135 12.5
4月 158 17
5月 172 8.9
6月 195 13.4

💡 组合图表用途:当需要同时展示不同量纲的数据时(如销售额和增长率),使用组合图表可以在同一图表中清晰展示。

📁 生成的文件结构
复制代码
openpyxl_tutorial/
├── chapter_05_chart/
│   ├── create_combo_chart.py    # 演示脚本
└── output/
    └── 组合图表.xlsx              # 生成的Excel文件

5.7 实例4:动态图表数据 📈

📁 代码路径 : openpyxl-tutorial/chapter_05_chart/create_dynamic_chart.py

📝 场景:创建基于公式数据的动态图表

📝 开发思路

  1. 创建工作簿并填充原始数据
  2. 使用公式计算统计数据
  3. 基于统计结果创建图表
  4. 保存文件
python 复制代码
# -*- coding: utf-8 -*-
"""
================================================================================
第5章/动态图表数据
================================================================================
开发思路:
1. 创建工作簿并填充原始数据
2. 使用公式计算统计数据
3. 基于统计结果创建图表
4. 保存文件
================================================================================
"""

# 从openpyxl导入Workbook类
from openpyxl import Workbook

# 导入图表相关类
from openpyxl.chart import BarChart, PieChart, Reference

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

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


def create_dynamic_chart():
  """
  创建基于公式数据的动态图表
  """
  wb = Workbook()
  ws = wb.active
  ws.title = "动态图表"

  # ==================== 1. 填充原始数据 ====================
  ws['A1'] = '员工销售业绩'
  ws['A1'].font = Font(size=14, bold=True)

  # 原始数据
  data = [
    ['姓名', '1月', '2月', '3月', '4月', '5月', '6月', '合计'],
    ['张三', 12, 15, 18, 20, 22, 25],
    ['李四', 10, 12, 14, 16, 18, 20],
    ['王五', 15, 18, 20, 22, 25, 28],
    ['赵六', 8, 10, 12, 14, 16, 18],
    ['钱七', 20, 22, 25, 28, 30, 35],
  ]

  for row_idx, row_data in enumerate(data, start=3):
    for col_idx, value in enumerate(row_data, 1):
      ws.cell(row=row_idx, column=col_idx, value=value)

  # 使用公式计算合计
  for row in range(4, 9):
    ws.cell(row=row, column=8, value=f'=SUM(B{row}:G{row})')

  # 表头样式
  for col in range(1, 9):
    cell = ws.cell(row=3, column=col)
    cell.font = Font(bold=True)
    cell.fill = PatternFill(start_color='D9E1F2', fill_type='solid')

  # ==================== 2. 创建员工业绩对比图 ====================
  chart1 = BarChart()
  chart1.type = "col"
  chart1.title = "员工上半年业绩对比"
  chart1.y_axis.title = '销售额(万元)'

  # 数据引用(包含公式计算的合计列)
  data = Reference(ws, min_col=8, min_row=3, max_row=8)
  categories = Reference(ws, min_col=1, min_row=4, max_row=8)

  chart1.add_data(data, titles_from_data=True)
  chart1.set_categories(categories)

  ws.add_chart(chart1, "J3")

  # ==================== 3. 创建月度趋势图 ====================
  from openpyxl.chart import LineChart

  line_chart = LineChart()
  line_chart.title = "月度销售趋势"
  line_chart.y_axis.title = '销售额(万元)'
  line_chart.x_axis.title = '月份'

  # 每个人各月的数据
  data = Reference(ws, min_col=2, min_row=3, max_col=7, max_row=8)
  categories = Reference(ws, min_col=2, min_row=3, max_col=7)

  line_chart.add_data(data, titles_from_data=True)
  line_chart.set_categories(categories)

  ws.add_chart(line_chart, "J25")

  # ==================== 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("  - 柱状图:基于SUM公式计算的合计数据")
  print("  - 折线图:展示每人每月的销售趋势")

  wb.close()
  return file_path


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

动态图表系统
动态图表
原始数据
公式计算
图表生成
员工月度销售数据

1-6月
SUM公式

计算个人合计
公式引用

动态更新
柱状图

员工业绩对比
折线图

月度销售趋势
数据流向
原始数据 → SUM公式
公式结果 → 图表数据
修改原始数据 → 图表自动更新

📊 代码执行时序图

文件系统 Reference类 图表类 Workbook类 Python脚本 用户 文件系统 Reference类 图表类 Workbook类 Python脚本 用户 loop [为每行添加SUM公式] 运行脚本 创建工作簿 返回wb对象 填充员工月度销售数据 H列写入=SUM(B:G)公式 创建BarChart柱状图 创建合计列数据引用 H3:H8 chart.add_data添加数据 设置图表标题和Y轴 ws.add_chart添加到J3位置 创建LineChart折线图 创建月度数据引用 B3:G8 line_chart.add_data添加数据 设置X轴月份类别 ws.add_chart添加到J25位置 os.makedirs创建目录 wb.save保存 写入Excel文件 保存成功 打印成功信息

🖨️ 代码运行效果

运行上述代码后,会生成一个名为 动态图表.xlsx 的Excel文件,包含2个基于公式数据的动态图表:

📊 动态图表效果
图表 位置 数据来源 特点
柱状图 J3 H列合计(SUM公式) 展示员工上半年总业绩对比
折线图 J25 B-G列月度数据 展示每人每月销售趋势

动态图表原理:

特性 说明
公式驱动 图表基于SUM公式计算的结果生成
自动更新 修改原始数据,图表自动更新
数据引用 使用Reference引用公式计算结果

数据与公式示例:

姓名 1月 2月 3月 4月 5月 6月 合计(公式)
张三 12 15 18 20 22 25 =SUM(B4:G4)
李四 10 12 14 16 18 20 =SUM(B5:G5)
... ... ... ... ... ... ... ...

💡 动态图表优势:当原始数据变化时,公式计算结果自动更新,图表也会随之更新,无需重新生成。

📁 生成的文件结构
复制代码
openpyxl_tutorial/
├── chapter_05_chart/
│   ├── create_dynamic_chart.py    # 演示脚本
└── output/
    └── 动态图表.xlsx                # 生成的Excel文件

5.5 本章知识总结 📝

第5章 图表创建
柱状图
折线图
饼图
组合图表
图表样式
BarChart
垂直/水平
堆叠模式
LineChart
趋势线
PieChart
百分比标签
柱状+折线
主次坐标轴
标题
图例
坐标轴
尺寸

本章重点回顾

图表类型 类名 适用场景 关键属性
柱状图 BarChart() 数据对比 type="col"/"bar"
折线图 LineChart() 趋势分析 -
饼图 PieChart() 占比展示 dataLabels.showPercent
面积图 AreaChart() 累积趋势 -
散点图 ScatterChart() 相关性分析 -

图表创建步骤

  1. 准备数据(包含标题行)
  2. 创建图表对象(BarChart/LineChart/PieChart等)
  3. 使用Reference定义数据范围
  4. 使用add_data()添加数据
  5. 使用set_categories()设置分类
  6. 使用add_chart()将图表添加到工作表

常用图表属性

  • chart.title:图表标题
  • chart.style:图表样式(1-48)
  • chart.width/height:图表尺寸
  • chart.legend.position:图例位置(t/b/l/r)
  • chart.y_axis.title:Y轴标题
  • chart.x_axis.title:X轴标题

下一章预告:我们将学习openpyxl的高级应用,包括数据透视表、图片插入等!


相关推荐
chushiyunen2 小时前
python pygame实现贪食蛇
开发语言·python·pygame
Dream of maid2 小时前
Python-基础2(流程控制)
python
Lenyiin3 小时前
《Python 修炼全景指南:一》从环境搭建到第一个程序
开发语言·python
涛声依旧393164 小时前
Python项目实战:学生信息管理系统
开发语言·python·数据挖掘
kcuwu.4 小时前
Python进阶:生成器与协程,高效并发编程的核心实践
windows·python·php
XiaoQiao6669994 小时前
python 简单题目练手【详解版】【1】
开发语言·python
ZC跨境爬虫4 小时前
极验滑动验证码自动化实战:背景提取、缺口定位与Playwright滑动模拟
前端·爬虫·python·自动化
智算菩萨4 小时前
【Python图像处理】2 数字图像基础与Python图像表示
开发语言·图像处理·python
xiaoshuaishuai85 小时前
Git二分法定位Bug
开发语言·python