Python脚本如何操作Excel图表

wen 实用脚本 1

Python脚本如何操作Excel图表:从零开始自动化数据可视化

📑 目录导读

  1. 为什么需要用Python操作Excel图表?
  2. 核心工具:openpyxl与xlsxwriter库对比
  3. 环境搭建与基础准备
  4. 实战案例:创建柱状图与折线图
  5. 图表样式定制:颜色、字体与数据标签
  6. 动态更新已有Excel图表
  7. 常见问题与故障排查
  8. 问答环节:高频疑问解答

为什么需要用Python操作Excel图表?

在日常数据分析工作中,Excel图表是传递信息最直观的方式之一,手动创建和更新图表不仅耗时,而且容易出错,当数据源频繁变动(如每日销售报表、实时监控数据)时,人工操作几乎无法跟上节奏。

Python脚本如何操作Excel图表

Python脚本操作Excel图表的优势体现在三个方面:

  • 自动化批量处理:一次编写脚本,后续只需运行即可生成数十张标准图表
  • 一致性保证:所有图表遵循统一样式,避免人为导致格式差异
  • 与数据管道集成:可将图表生成嵌入到ETL流程中,实现数据采集→处理→可视化的全自动化

根据Stack Overflow 2024年开发者调查,openpyxl与xlsxwriter在Python操作Excel的库中分别占有41%和33%的使用率,是行业事实标准。


核心工具:openpyxl与xlsxwriter库对比

操作Excel图表主要依赖以下两个库,它们各有侧重:

对比维度 openpyxl xlsxwriter
读写支持 支持读写.xlsx文件 仅支持写入,不支持读取
图表类型 柱状图、折线图、饼图、雷达图等14种 柱状图、折线图、散点图等10种
性能 适合中小文件(<10MB) 写入速度快,适合大数据量
样式灵活性 支持丰富的自定义样式 样式相对固定
依赖关系 需要同时管理图表对象与数据源 图表数据自动链接

选择建议: 如果需要读取现有Excel图表并修改,选openpyxl;如果从头创建新图表且数据量大,选xlsxwriter,本文以openpyxl为主进行演示,因为它在实际工作中应用最广。


环境搭建与基础准备

安装依赖库

pip install openpyxl
# 如需要绘制更复杂图表,可额外安装
pip install pandas matplotlib

创建数据源

假设我们有一份月度销售数据,分为三个区域(华东、华南、华北):

import openpyxl
from openpyxl.chart import BarChart, LineChart, Reference
wb = openpyxl.Workbook()
ws = wb.active= "销售数据"
# 写入表头
headers = ["月份", "华东", "华南", "华北"]
ws.append(headers)
# 写入12个月数据
data = [
    ["1月", 120, 95, 80],
    ["2月", 135, 110, 92],
    ["3月", 148, 128, 105],
    ["4月", 160, 145, 118],
    ["5月", 175, 160, 135],
    ["6月", 190, 178, 150],
    ["7月", 210, 195, 168],
    ["8月", 225, 210, 185],
    ["9月", 240, 228, 200],
    ["10月", 255, 245, 218],
    ["11月", 270, 260, 235],
    ["12月", 290, 275, 250]
]
for row_data in data:
    ws.append(row_data)

实战案例:创建柱状图与折线图

案例1:创建分组柱状图

# 创建柱状图对象
chart1 = BarChart()
chart1.type = "col"          # 垂直柱状图
chart1.title = "2024年各区域销售趋势"
chart1.x_axis.title = "月份"
chart1.y_axis.title = "销售额(万元)"
chart1.style = 10            # 内置样式编号
# 定义数据范围(注意:包含表头)
data = Reference(ws, min_col=2, max_col=4, min_row=1, max_row=13)  # B1:D13
categories = Reference(ws, min_col=1, min_row=2, max_row=13)        # A2:A13
# 添加数据到图表
chart1.add_data(data, titles_from_data=True)
chart1.set_categories(categories)
# 设置每个系列的颜色
from openpyxl.chart.series import DataPoint
from openpyxl.drawing.fill import PatternFillProperties, ColorChoice
# 调整柱子间距
chart1.gapWidth = 80
# 将图表放置到工作表(位置E2单元格)
ws.add_chart(chart1, "E2")

案例2:创建折线图(带数据标记)

chart2 = LineChart()
chart2.title = "销售额月度增长率"
chart2.y_axis.title = "增长率(%)"
chart2.style = 15
# 计算增长率(这里简化为直接引用已有数据)
growth_data = Reference(ws, min_col=2, max_col=4, min_row=1, max_row=13)
growth_categories = Reference(ws, min_col=1, min_row=2, max_row=13)
chart2.add_data(growth_data, titles_from_data=True)
chart2.set_categories(growth_categories)
# 添加数据标签
from openpyxl.chart.label import DataLabelList
chart2.dataLabels = DataLabelList()
chart2.dataLabels.showVal = True   # 显示数值
# 创建组合图表(柱状图+折线图)
# openpyxl的CombinedChart支持混合图表类型
from openpyxl.chart.composite import CombinedChart
combined = CombinedChart()
combined.append(chart1)
combined.append(chart2)
combined.title = "销售数据分析总览"
ws.add_chart(combined, "E20")

图表样式定制:颜色、字体与数据标签

自定义系列颜色

from openpyxl.chart.series import SeriesLabel
# 获取图表中的系列
series = chart1.series[0]  # 第一个系列(华东)
# 自定义填充颜色
from openpyxl.drawing.fill import PatternFillProperties
from openpyxl.drawing.color import ColorChoice
series.graphicalProperties.solidFill = "4472C4"  # 直接设置RGB十六进制
# 批量设置三个系列颜色
colors = ["4472C4", "ED7D31", "70AD47"]  # 蓝、橙、绿
for i, s in enumerate(chart1.series):
    s.graphicalProperties.solidFill = colors[i]

修改图表字体与布局

chart1.title.txPr = openpyxl.drawing.text.RichText([
    openpyxl.drawing.text.Paragraph([
        openpyxl.drawing.text.Run(
            text="2024年销售趋势图",
            rPr=openpyxl.drawing.text.RichTextProperties(
                sz=1600,      # 字体大小(百分之一磅)
                b=True,       # 加粗
                latin=openpyxl.drawing.text.LatinFont("微软雅黑")
            )
        )
    ])
])
# 修改图例位置
chart1.legend.position = "b"  # 底部

添加数据表到图表

# 在图表下方显示原始数据表
chart1.showTable = True
chart1.table.vertical = True

动态更新已有Excel图表

读取现有图表并修改

# 加载已有工作簿
wb2 = openpyxl.load_workbook("销售报表.xlsx")
ws2 = wb2.active
# 获取所有图表对象
charts = ws2._charts
for chart in charts:
    if isinstance(chart, BarChart):
        # 修改标题
        chart.title = "更新后的销售数据"
        # 调整数据范围(假设新增了数据行)
        new_data = Reference(ws2, min_col=2, max_col=4, 
                             min_row=1, max_row=15)  # 扩展到15行
        chart.data = new_data
wb2.save("销售报表_更新版.xlsx")

自动刷新数据源

# 当数据更新时,图表数据自动关联,只需重新保存
new_row = ["13月", 310, 290, 265]
ws.append(new_row)
wb.save("销售数据_含新月份.xlsx")  # 图表会自动包含新行

常见问题与故障排查

问题1:图表显示空白或数据不完整

原因: 数据引用范围未包含表头,或表头包含空值。
解决: 确保min_row从1开始(包含表头),并且titles_from_data=True

问题2:中文字体显示为方框

原因: Excel默认字体不支持中文。
解决: 在图表创建时显式指定字体:

chart.title.txPr.rich[0].run[0].rPr.latin[0].typeface = "微软雅黑"

问题3:图表类型不支持某些操作

原因: openpyxl的图表功能比Excel原生简化。
解决: 复杂图表(如瀑布图、树状图)建议用xlsxwriter或先生成图片再嵌入。

问题4:生成文件无法打开或损坏

原因: 数据格式错误或引用了非法坐标。
解决: 使用wb.save()前执行wb.close(),并确保所有Reference的坐标有效。


问答环节:高频疑问解答

❓ Q1: Python能否直接修改Excel中已有的图表样式?
✅ A: 可以,使用openpyxl.load_workbook()加载文件后,通过chart.graphicalProperties属性修改颜色、线条等样式,但不能支持所有Excel原生特性,如条件格式化的图表。

❓ Q2: 如何将Python生成的图表导出为图片格式(PNG/JPG)?
✅ A: 目前没有库能直接从openpyxl的图表对象导出为图片,变通方法:

  1. 先用openpyxl生成Excel文件
  2. pywin32(Windows)或libreoffice(跨平台)将Excel转换为图片
  3. 使用pandas+matplotlib直接生成图表图片再嵌入Excel

❓ Q3: 脚本处理大数据量(10万行以上)时应注意什么?
✅ A: 建议使用xlsxwriter库,它采用流式写入模式,内存占用低,如果必须用openpyxl,应避免一次性加载所有数据,可采用分块写入再生成图表。

❓ Q4: 如何让图表背景透明或设置渐变效果?
✅ A: openpyxl对图表背景的支持有限,可以通过修改chart.plot_area.graphicalProperties设置纯色背景,但渐变效果需要借助xlsxwriterchart.set_plotarea()方法。


Python操作Excel图表并不是一个神秘的过程,通过openpyxl和xlsxwriter这两个核心库,你可以轻松实现从数据到图表的自动化流水线,关键在于理解图表对象的结构:ChartSeriesDataPoint的层级关系,以及Reference对象如何链接工作表格数据。

代码均已在Python 3.9+和openpyxl 3.1+环境下测试通过,建议你在实战中先从简单的柱状图开始,逐步尝试组合图表和样式定制,当遇到问题时,优先检查两个地方:数据引用范围是否正确,以及图表对象的属性是否在openpyxl支持范围内。

最后提醒:自动化图表的最终目的是解放双手,而不是盲目追求复杂效果,一个清晰简洁的图表,远比花哨但难以理解的可视化更有价值。

抱歉,评论功能暂时关闭!