You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用Python正确重命名Excel图表中的数据系列?

解决Excel图表数据系列名称显示为首个数值而非表头的问题

问题根源

你代码里的核心问题是数据范围没包含表头行:

  • 所有valuesX的Reference都从min_row=2开始,只取了数据行,没包含第1行的表头
  • 当设置titles_from_data=True时,openpyxl会从你指定的数据范围的第一行提取系列名称,所以自然把首个数据值当成了标题
  • 之前手动修改chart.series[0].title没生效,大概率是因为add_data时的设置覆盖了你的手动修改,或者你没按openpyxl要求的格式赋值

两种可行解决方案

方案1:让openpyxl自动读取表头(推荐)

调整Reference的范围,把表头行(row=1)包含进去,同时保留titles_from_data=True:

chart1 = LineChart()
chart2 = LineChart()
chart3 = LineChart()

# 关键修改:把所有values的min_row改为1,包含表头行
data1 = Reference(new_sheet, min_col=12, min_row=2, max_col=12, max_row=new_sheet.max_row)  # X轴数据不需要表头
values1 = Reference(new_sheet, min_col=13, min_row=1, max_col=13, max_row=new_sheet.max_row)  # 包含"Flux-mittel"表头
values2 = Reference(new_sheet, min_col=14, min_row=1, max_col=14, max_row=new_sheet.max_row)  # 包含"Flux-aktuell"表头
values3 = Reference(new_sheet, min_col=9, min_row=1, max_col=9, max_row=new_sheet.max_row)   # 包含"Volume Filtrate"表头
values4 = Reference(new_sheet, min_col=10, min_row=1, max_col=10, max_row=new_sheet.max_row)  # 包含"deltaP"表头
values5 = Reference(new_sheet, min_col=11, min_row=1, max_col=11, max_row=new_sheet.max_row)  # 包含"TMP"表头
values6 = Reference(new_sheet, min_col=7, min_row=1, max_col=7, max_row=new_sheet.max_row)  # 包含"Temperatur Filter"表头
values7 = Reference(new_sheet, min_col=8, min_row=1, max_col=8, max_row=new_sheet.max_row)  # 包含"Turbidity Filter"表头

# add_data时保留titles_from_data=True,openpyxl会自动用表头当系列名
chart1.add_data(values1, titles_from_data=True)
chart1.add_data(values2, titles_from_data=True)
chart1.add_data(values3, titles_from_data=True)
chart1.set_categories(data1)

# 其余图表的add_data逻辑同理
chart2.add_data(values4, titles_from_data=True)
chart2.add_data(values5, titles_from_data=True)
chart2.set_categories(data1)

chart3.add_data(values6, titles_from_data=True)
chart3.add_data(values7, titles_from_data=True)
chart3.set_categories(data1)

# 后续的标题、图例、尺寸、保存代码保持不变
# ...(此处省略你原代码中其余不变的部分)

方案2:手动指定系列名称

如果不想修改数据范围,就关闭titles_from_data,然后用SeriesTitle对象手动设置每个系列的名称:

from openpyxl.chart.series import SeriesTitle

# 数据范围保持min_row=2不变
values1 = Reference(new_sheet, min_col=13, min_row=2, max_col=13, max_row=new_sheet.max_row)
# ...其余values定义不变

# add_data时设置titles_from_data=False
chart1.add_data(values1, titles_from_data=False)
chart1.add_data(values2, titles_from_data=False)
chart1.add_data(values3, titles_from_data=False)
chart1.set_categories(data1)

# 手动指定每个系列的名称
chart1.series[0].title = SeriesTitle("Flux-mittel")
chart1.series[1].title = SeriesTitle("Flux-aktuell")
chart1.series[2].title = SeriesTitle("Volume Filtrate")

# 其余图表同理
chart2.add_data(values4, titles_from_data=False)
chart2.add_data(values5, titles_from_data=False)
chart2.set_categories(data1)
chart2.series[0].title = SeriesTitle("deltaP")
chart2.series[1].title = SeriesTitle("TMP")

chart3.add_data(values6, titles_from_data=False)
chart3.add_data(values7, titles_from_data=False)
chart3.set_categories(data1)
chart3.series[0].title = SeriesTitle("Temperatur Filter")
chart3.series[1].title = SeriesTitle("Turbidity Filter")

# 后续代码保持不变
# ...

验证效果

修改后保存文件,打开Excel查看图表的系列名称,应该会正确显示对应的表头文本,而不是首个数据值。

内容的提问来源于stack exchange,提问作者Frantishek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 19:41:02