Python如何操作Excel图表?openpyxl技巧

看不見的法師
发布: 2025-08-12 12:21:01
原创
911人浏览过

使用openpyxl操作excel图表需先准备数据并写入工作表;2. 创建图表对象(如barchart)并设置类型、标题、轴标签等属性;3. 通过reference定义数据范围和类别,并用add_data或series方式添加数据系列;4. 自定义图表样式、尺寸、位置、图例、数据标签等属性;5. 将图表添加到指定单元格并保存文件。openpyxl支持柱状图、折线图、饼图等多种常见图表类型,适合自动化生成标准化报表,但在修改复杂图表、精细视觉控制和高级功能(如次坐标轴)方面存在局限,更适合从零构建而非精细编辑。

Python如何操作Excel图表?openpyxl技巧

Python操作Excel图表,主要通过

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
库来完成。它并非一个所见即所得的图表编辑器,更像是一个“构建器”——你通过代码定义图表的类型、数据来源、样式和位置,然后
openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
会将这些指令写入Excel文件,最终由Excel应用程序负责渲染。核心思路是,我们用代码告诉Excel“这里有一堆数据,请你用这种方式把它画成图”。

解决方案

要用

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
来创建和操作Excel图表,通常需要以下几个步骤。这不是一个线性的“首先、其次”过程,更像是构建一个乐高模型,你可以先搭主体,再加细节,或者反过来。

首先,你得有数据。图表是数据的可视化,所以得在工作表中填入一些数据,作为图表的源。

立即学习Python免费学习笔记(深入)”;

from openpyxl import Workbook
from openpyxl.chart import BarChart, Reference, Series
from openpyxl.chart.label import DataLabelList

# 创建一个新的工作簿和工作表
wb = Workbook()
ws = wb.active
ws.title = "销售数据分析"

# 准备一些数据,图表会用到这些
data = [
    ["产品", "2022年销量", "2023年销量"],
    ["A", 100, 120],
    ["B", 150, 140],
    ["C", 90, 110],
    ["D", 200, 180],
    ["E", 130, 150],
]

for row_data in data:
    ws.append(row_data)

# 创建一个柱状图对象
chart = BarChart()
chart.type = "col" # 可以是 'col' (柱状), 'bar' (条形)
chart.style = 10 # 选择一个图表样式,数字越大样式越复杂或颜色越丰富
chart.title = "产品年度销售对比"
chart.y_axis.title = "销量 (单位: 件)"
chart.x_axis.title = "产品类型"

# 定义图表的数据范围。Reference 是 openpyxl 处理数据源的关键。
# 第一个 Reference 是类别标签(产品A, B, C...)
# 第二个 Reference 是数据系列(2022年销量, 2023年销量)
# 这里的 min_row=2 是因为第一行是标题,数据从第二行开始
# max_row=ws.max_row 是因为数据到工作表的最后一行
# min_col=2, max_col=3 是因为销量数据在第2列和第3列
categories = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row)
data_ref = Reference(ws, min_col=2, min_row=1, max_col=3, max_row=ws.max_row)

# 将数据添加到图表中
# from_rows=True 表示数据是按行排列的,即每行是一个数据系列
# 这通常用于多系列图表,如果每个系列是列,则不需要这个参数
chart.add_data(data_ref, titles_from_data=True) # titles_from_data=True 表示第一行作为系列名称
chart.set_categories(categories)

# 调整图表大小和位置
chart.width = 15 # 宽度
chart.height = 8 # 高度

# 添加数据标签
# chart.dataLabels = DataLabelList()
# chart.dataLabels.showVal = True # 显示值
# chart.dataLabels.showCatName = True # 显示类别名称

# 将图表添加到工作表中的指定位置(例如从A10单元格开始)
ws.add_chart(chart, "A10")

# 保存工作簿
wb.save("产品销售图表.xlsx")
print("Excel文件已生成,包含产品销售图表。")
登录后复制

这段代码展示了一个基本的柱状图创建流程。你会发现,

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
在操作图表时,更侧重于数据源的绑定和基本属性的设置,而非精细到每个像素的视觉调整。

openpyxl支持哪些常见的Excel图表类型?如何选择合适的图表?

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
对Excel中的图表支持还是比较全面的,常见的图表类型基本都能搞定。你可以通过导入不同的图表类来使用它们,比如
BarChart
登录后复制
(柱状图/条形图),
LineChart
登录后复制
(折线图),
ScatterChart
登录后复制
(散点图),
PieChart
登录后复制
(饼图),
AreaChart
登录后复制
(面积图), 甚至还有
BubbleChart
登录后复制
(气泡图) 和
StockChart
登录后复制
(股票图)。

选择合适的图表,这其实是个数据可视化的问题,比敲代码复杂多了。我个人觉得,很多人在做数据分析的时候,图表选择上容易犯迷糊,总想着“把所有数据都画出来”。但图表的目的是讲故事,传递信息,不是堆砌数据。

  • 柱状图/条形图 (BarChart):非常适合比较不同类别之间的数据大小。比如不同产品的销量、不同地区的营收。如果你想看“谁更高”,用它准没错。
  • 折线图 (LineChart):看趋势的最佳选择。时间序列数据,比如股票价格波动、月度销售额变化,用折线图能清晰地展现上升、下降或平稳的趋势。
  • 散点图 (ScatterChart):当你需要探索两个数值变量之间的关系时,散点图是首选。比如广告投入和销售额之间有没有关联,身高和体重是不是正相关。它能帮你发现潜在的模式或异常点。
  • 饼图 (PieChart):表示“部分与整体”的关系。比如市场份额、各项开支占比。但要注意,饼图的扇区不宜过多,超过5-7个就很难分辨了,而且比较不同扇区的大小,人眼不如柱状图敏感。我通常会避免用饼图,除非占比非常清晰且数量少。
  • 面积图 (AreaChart):和折线图类似,但通过填充折线下的区域来强调数量或累积值。可以用来展示不同类别随时间变化的贡献,例如不同产品线的累积销售额。

最终,选择图表就像选择合适的词语来表达一个想法。你得先清楚你想表达什么,然后才去选那个最能传达意思的“词语”——也就是图表。有时候,一个简单的表格,配合一些条件格式,比任何图表都更能直观地展现数据。

在openpyxl中,如何为图表添加数据系列和自定义图表属性?

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
里,数据系列(Data Series)是图表的灵魂,它告诉图表“你要画什么数据”。自定义图表属性则是给这个灵魂穿上漂亮的衣服,让它看起来更专业、更易懂。

添加数据系列: 核心是

Reference
登录后复制
登录后复制
登录后复制
登录后复制
对象和
chart.add_data()
登录后复制
方法。
Reference
登录后复制
登录后复制
登录后复制
登录后复制
定义了数据在工作表中的位置。它需要四个参数:
sheet
登录后复制
(哪个工作表),
min_col
登录后复制
,
min_row
登录后复制
,
max_col
登录后复制
,
max_row
登录后复制
。你可以把它想象成在Excel里用鼠标拖选一个区域。

from openpyxl.chart import Reference, Series
# 假设ws是你的工作表
# 这是一个单系列数据的例子,比如只画2022年销量
values = Reference(ws, min_col=2, min_row=2, max_col=2, max_row=ws.max_row)
# categories = Reference(ws, min_col=1, min_row=2, max_row=ws.max_row) # 类别通常是X轴标签

# 创建一个 Series 对象,这更精细地定义了一个数据系列
# values: 数据值,可以是 Reference 或直接的列表
# xvalues: X轴的值,通常是类别,也是 Reference
# title: 系列名称,会显示在图例中
series = Series(values, xvalues=categories, title="2022年销量")
chart.series.append(series) # 将系列添加到图表中
登录后复制

如果你有多个系列,比如前面例子中的2022和2023年销量,最简单的方法是

chart.add_data(data_ref, titles_from_data=True)
登录后复制
,它会自动根据
data_ref
登录后复制
范围内的第一行或第一列来识别多个系列。如果你需要更精细地控制每个系列(比如给每个系列设置不同的颜色或标记),那么手动创建
Series
登录后复制
对象并逐个
append
登录后复制
会更灵活。

自定义图表属性:

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的图表对象有很多属性可以直接设置,这些属性对应着Excel图表中的各种选项。

  • 标题:
    chart.title = "我的图表标题"
    登录后复制
  • 轴标题:
    chart.x_axis.title = "X轴名称"
    登录后复制
    ,
    chart.y_axis.title = "Y轴名称"
    登录后复制
  • 尺寸和位置:
    chart.width = 15
    登录后复制
    (单位是Excel列宽),
    chart.height = 8
    登录后复制
    (单位是Excel行高)。然后通过
    ws.add_chart(chart, "A10")
    登录后复制
    来决定图表在工作表中的左上角位置。
  • 样式:
    chart.style = 10
    登录后复制
    openpyxl
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    提供了一些预定义的样式,你可以尝试不同的数字看看效果。
  • 图例:
    chart.legend.position = 'r'
    登录后复制
    (右侧),
    'l'
    登录后复制
    (左侧),
    't'
    登录后复制
    (顶部),
    'b'
    登录后复制
    (底部)。你也可以设置
    chart.legend.delete = True
    登录后复制
    来隐藏图例。
  • 数据标签: 这是个稍微复杂一点的,需要导入
    DataLabelList
    登录后复制
    from openpyxl.chart.label import DataLabelList
    chart.dataLabels = DataLabelList()
    chart.dataLabels.showVal = True # 显示值
    chart.dataLabels.showCatName = True # 显示类别名称
    # 还可以设置 showLegendKey, showPct, showSerName 等
    登录后复制
  • 轴刻度: 比如设置Y轴的最大最小值:
    chart.y_axis.scaling.min = 0
    登录后复制
    chart.y_axis.scaling.max = 200
    登录后复制
    chart.y_axis.majorGridlines = None
    登录后复制
    # 隐藏主要网格线

通过组合这些属性,你几乎可以控制图表的大部分视觉呈现。不过,有些非常细致的、Excel特有的格式(比如某个数据点的特定颜色、复杂的渐变背景)可能就超出了

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的直接控制范围了,那可能就需要手动调整或者寻找其他更底层的XML操作方法了。但对于自动化报告来说,这些功能已经绰绰有余。

使用openpyxl操作图表时,有哪些常见挑战和局限性?

尽管

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
在处理Excel文件方面非常强大,但在操作图表时,确实会遇到一些挑战和局限性,这很大程度上取决于你对“操作”的定义。如果你想的是像在Excel里那样拖拽、点击、精细调整每个细节,那
openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
可能不是你想象中的那个工具

首先,一个比较大的挑战是对现有复杂图表的修改

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
更擅长的是从零开始创建图表,或者更新现有图表的数据源。如果你有一个手动创建的、非常复杂的Excel图表,里面包含了各种自定义的形状、文本框、特定颜色、趋势线等等,然后你想用
openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
去精确地修改其中的某个元素(比如只改变其中一根柱子的颜色,或者调整某个文本框的位置),这几乎是不可能直接做到的。
openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
抽象了底层的XML结构,但它没有提供一个完整的、像Excel UI那样精细的API来访问和修改每一个图表组件的属性。它能做的更多是宏观层面的控制,比如改变图表类型、标题、轴标签、数据源、整体样式等。

其次,高级图表功能的支持有限。例如,创建带有次坐标轴(secondary axis)的复杂组合图表,或者需要非常特定、非标准的误差线、数据点标签格式,甚至是动态的图表标题(标题内容随某个单元格变化),这些在

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
中实现起来会非常困难,甚至无法实现。有些功能可能需要你手动编辑生成的Excel文件,或者寻找其他更低层级的库(比如直接操作OOXML)。

再者,视觉保真度问题。你用

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
创建的图表,其默认样式和Excel手动创建的图表可能存在细微差异。这通常不是大问题,但如果你对最终的视觉效果有像素级的要求,可能需要更多的尝试和调整,或者接受一些不一致。
openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
的样式系统是基于Excel内置的样式ID,而不是完全自由的RGB颜色或字体选择。

还有,调试起来不那么直观。当你的图表没有按预期显示,或者数据映射有问题时,

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
不会给你实时的视觉反馈。你必须保存文件,然后用Excel打开它才能看到效果。这使得调试过程相对繁琐,尤其是当涉及到复杂的
Reference
登录后复制
登录后复制
登录后复制
登录后复制
定义或多个数据系列时。

最后,学习曲线。理解

Reference
登录后复制
登录后复制
登录后复制
登录后复制
对象的工作方式,以及各种图表属性的层级关系(比如
chart.x_axis.title
登录后复制
而不是
chart.x_title
登录后复制
),需要一些时间去熟悉。它不像一些高级绘图库(如
matplotlib
登录后复制
seaborn
登录后复制
)那样,提供了非常直观和灵活的API来直接操作图形元素。
openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
更多的是遵循Excel的内部模型来构建文件。

总的来说,

openpyxl
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
在自动化生成标准化的、数据驱动的Excel报告时表现出色。它非常适合那些需要批量生成图表,且图表类型和样式相对固定的场景。但如果你需要一个功能全面的、能够精细控制每个视觉细节的“图表编辑器”,或者需要修改大量现有复杂图表,那么它可能不是最理想的选择,你可能需要考虑其他工具或手工操作。

以上就是Python如何操作Excel图表?openpyxl技巧的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号