Python中,使用openpyxl.chart生成excel中的柱形图BarChart

说明

如图,表格中已有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('柱形图生成完成!')
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容