使用openpyxl操作excel图表需先准备数据并写入工作表;2. 创建图表对象(如barchart)并设置类型、标题、轴标签等属性;3. 通过reference定义数据范围和类别,并用add_data或series方式添加数据系列;4. 自定义图表样式、尺寸、位置、图例、数据标签等属性;5. 将图表添加到指定单元格并保存文件。openpyxl支持柱状图、折线图、饼图等多种常见图表类型,适合自动化生成标准化报表,但在修改复杂图表、精细视觉控制和高级功能(如次坐标轴)方面存在局限,更适合从零构建而非精细编辑。
Python操作Excel图表,主要通过
openpyxl
openpyxl
要用
openpyxl
首先,你得有数据。图表是数据的可视化,所以得在工作表中填入一些数据,作为图表的源。
立即学习“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
BarChart
LineChart
ScatterChart
PieChart
AreaChart
BubbleChart
StockChart
选择合适的图表,这其实是个数据可视化的问题,比敲代码复杂多了。我个人觉得,很多人在做数据分析的时候,图表选择上容易犯迷糊,总想着“把所有数据都画出来”。但图表的目的是讲故事,传递信息,不是堆砌数据。
最终,选择图表就像选择合适的词语来表达一个想法。你得先清楚你想表达什么,然后才去选那个最能传达意思的“词语”——也就是图表。有时候,一个简单的表格,配合一些条件格式,比任何图表都更能直观地展现数据。
在
openpyxl
添加数据系列: 核心是
Reference
chart.add_data()
Reference
sheet
min_col
min_row
max_col
max_row
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
chart.title = "我的图表标题"
chart.x_axis.title = "X轴名称"
chart.y_axis.title = "Y轴名称"
chart.width = 15
chart.height = 8
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 等
chart.y_axis.scaling.min = 0
chart.y_axis.scaling.max = 200
chart.y_axis.majorGridlines = None
通过组合这些属性,你几乎可以控制图表的大部分视觉呈现。不过,有些非常细致的、Excel特有的格式(比如某个数据点的特定颜色、复杂的渐变背景)可能就超出了
openpyxl
尽管
openpyxl
openpyxl
首先,一个比较大的挑战是对现有复杂图表的修改。
openpyxl
openpyxl
openpyxl
其次,高级图表功能的支持有限。例如,创建带有次坐标轴(secondary axis)的复杂组合图表,或者需要非常特定、非标准的误差线、数据点标签格式,甚至是动态的图表标题(标题内容随某个单元格变化),这些在
openpyxl
再者,视觉保真度问题。你用
openpyxl
openpyxl
还有,调试起来不那么直观。当你的图表没有按预期显示,或者数据映射有问题时,
openpyxl
Reference
最后,学习曲线。理解
Reference
chart.x_axis.title
chart.x_title
matplotlib
seaborn
openpyxl
总的来说,
openpyxl
以上就是Python如何操作Excel图表?openpyxl技巧的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 //m.sbmmt.com/ All Rights Reserved | php.cn | 湘ICP备2023035733号