第5章 图表创建 - 让数据可视化
5.1 本章学习目标
通过本章学习,你将掌握:
- 基础图表:柱状图、折线图、饼图的创建方法
- 图表样式:标题、图例、坐标轴、数据标签的定制
- 组合图表:多种图表类型的组合使用
- 动态图表:基于公式数据的动态图表创建
- 图表布局:图表位置、大小、颜色的调整
5.2 为什么要使用图表?
🌟 生活类比:想象你要向老板汇报公司过去一年的销售情况。是给他看密密麻麻的数字表格,还是给他看一张清晰的折线图?图表能让数据"说话",让人一眼就能看出趋势和规律。
图表的优势:
- 直观展示:数据趋势、对比一目了然
- 发现规律:容易发现数据中的模式和异常
- 便于汇报:图表比纯数字更有说服力
- 支持决策:帮助快速做出数据驱动的决策
5.3 图表类型概览
Excel图表类型
柱状图
折线图
饼图
散点图
面积图
雷达图
对比数据
分类展示
趋势分析
时间序列
占比展示
构成分析
相关性分析
分布展示
累积趋势
堆叠展示
多维对比
能力评估
5.4 实例1:销售数据可视化报表 📊
📁 代码路径 : openpyxl-tutorial/chapter_05_chart/create_sales_chart_report.py
📝 场景:创建包含多种图表的销售数据可视化报表
📝 开发思路:
- 创建工作簿
- 填充销售数据
- 创建柱状图展示月度销售额对比
- 创建折线图展示销售趋势
- 创建饼图展示产品占比
- 调整图表位置和大小
- 保存文件
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
📝 场景:学习如何自定义图表的样式、颜色、图例等
📝 开发思路:
- 创建工作簿并填充数据
- 创建基础图表
- 自定义图表样式(颜色、字体、图例位置)
- 保存文件
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
📝 场景:创建柱状图和折线图的组合图表,同时展示销售额和增长率
📝 开发思路:
- 创建工作簿并填充数据(销售额和增长率)
- 创建柱状图展示销售额
- 创建折线图展示增长率
- 将两个图表组合
- 保存文件
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
📝 场景:创建基于公式数据的动态图表
📝 开发思路:
- 创建工作簿并填充原始数据
- 使用公式计算统计数据
- 基于统计结果创建图表
- 保存文件
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() |
相关性分析 | - |
图表创建步骤:
- 准备数据(包含标题行)
- 创建图表对象(BarChart/LineChart/PieChart等)
- 使用Reference定义数据范围
- 使用add_data()添加数据
- 使用set_categories()设置分类
- 使用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的高级应用,包括数据透视表、图片插入等!