求助:如何用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
相关产品推荐
相关产品推荐

