说明
如图,表格中已有Sheet 数据,每组用一行空白隔开。
本工具为每组各生成一个柱形图,从上向下放置在新创建的Sheet 图表 中。
具体的生成过程和方法见下面的具体代码及注释。

数据.png

图表.png
具体代码
生成excel条形图.py
import os
import sys
from openpyxl import load_workbook
from openpyxl import chart
from openpyxl.chart import BarChart, Reference, Series
from openpyxl.chart.series import SeriesLabel
if __name__ == "__main__":
# 柱形图的样式风格
BarChartStyle = 1
# 每个柱形图的名称
TitleNameCol = 1
TitleNameSuffix = '1-6月兴趣班报名人数对比'
# X轴的单位,一般是日期,如1、2、3、4月
CategoriesCnt = 6
MinCategoriesCol = 2
MaxCategoriesCol = MinCategoriesCol + CategoriesCnt - 1
# 每个x的单位中有几类值,这几类值的名字、(柱子的)颜色分别是什么
SeriesCnt = 5
SeriesTitles = ['2021年','2022年','2023年','2024年','2025年']
SeriesColors = ['5B9BD5','ED7D31','FF0000','00FF00','0000FF']
# 类型的Title在哪个位置显示:'b', 'tr'(右上 top right), 'l', 'r', 't'
SeriesTitlePos = 'b'
# 图的高和宽。高的1约等于2个row的高度,比2个row小
ChartHeight = 15
ChartHeightToRowFactor = 2
ChartWidth = 20
# 每个x的单位中的几类值(柱子)之间的重叠程度(负数表示不重叠且有间隔)
ChartPerBarInSeriesOverlap = -20
# 表格文件放在和当前py文件同目录下
dir = os.path.dirname(sys.argv[0])
fileName = 'TestChart.xlsx'
filePath = os.path.join(dir,fileName)
workbook = load_workbook(filePath)
# 表格中已有一个sheet,名为'数据',基于此生成各柱形图。创建一个新sheet'图表'用于放置柱形图
dataSheet = workbook['数据']
chartSheet = workbook.create_sheet('图表')
# 一共要绘制几张柱形图?每个柱形图数据上方是一个空行(依此找到各图对应的第一行数据)
rowNums = []
for row in dataSheet.iter_rows():
curCell = row[0]
if curCell.value is None:
rowNums.append(curCell.row+1)
print(f'要生成的柱形图的数量为{len(rowNums)},各图对应的数据的第一行的行号分别为{rowNums}')
# 依次生成各柱形图
for i in range(len(rowNums)):
# 生成柱形图的具体步骤
rowNum = rowNums[i]
# 对于每组(一张柱形图对应一组)数据,第一行是本组的category,下面的几行是具体数据
categories = Reference(dataSheet, min_row=rowNum, max_row=rowNum, min_col=MinCategoriesCol, max_col=MaxCategoriesCol)
valueBeginRow = rowNum+1
values = Reference(dataSheet, min_row=valueBeginRow, max_row=rowNum+SeriesCnt, min_col=MinCategoriesCol,max_col=MaxCategoriesCol)
titleName = dataSheet.cell(valueBeginRow,TitleNameCol).value
curChart = BarChart()
curChart.style = BarChartStyle
curChart.title = f"{titleName}{TitleNameSuffix}"
curChart.anchor = f'A{(1+i*ChartHeight)*ChartHeightToRowFactor}'
curChart.height = ChartHeight
curChart.width = ChartWidth
curChart.overlap = ChartPerBarInSeriesOverlap
# 一行对应一组(Category)数据
curChart.add_data(values, from_rows=True)
curChart.set_categories(categories)
# series(各类柱子)的说明显示在上下左右哪个位置
curChart.legend.position = SeriesTitlePos
# 设置各series说明的内容和各series的颜色
for i in range(SeriesCnt):
curChart.series[i].title =SeriesLabel(v=SeriesTitles[i])
curChart.series[i].graphicalProperties.solidFill = SeriesColors[i]
# 每个柱子上方显示且只显示数值
curChart.dLbls=chart.label.DataLabelList()
curChart.dLbls.showSerName = False
curChart.dLbls.showCatName = False
curChart.dLbls.showLegendKey = False
curChart.dLbls.showVal = True
# 把画好的柱形图设置到sheet中
chartSheet.add_chart(curChart)
# 保存表格文件
workbook.save(filePath)
print('柱形图生成完成!')