各个事业部需要在工作表中生成利润走势图,来分析利润走向。
但是一共有52个部门,也就是需要给52个Excel表格绘图,同样的绘图操作要重复52遍,如果一个个操作实在浪费时间。
还有绘制什么样式的图也需要琢磨一下。既然是分析利润的走势,那么选择折线图就可以更好地展示数据的变化趋势。
代码实现:
import os
from openpyxl import load_workbook
from openpyxl.chart import LineChart, Reference
# 设置目标文件夹路径
path = './各部门利润表汇总/'
# 获取文件夹下的所有文件名
file_list = os.listdir(path)
# 遍历文件名列表,取得每一个文件名
for file_name in file_list:
# 拼接文件路径
file_path = path + file_name
print('正在处理:' + file_name)
# 读取工作簿
wb = load_workbook(file_path)
# 读取工作簿中的活跃工作表
ws = wb.active
# 实例化 LineChart 类,得到 LineChart 对象
chart = LineChart()
# 引用工作表的部分数据
data = Reference(worksheet=ws, min_row=3, max_row=9, min_col=1, max_col=5)
# 添加被引用的数据到 LineChart 对象
chart.add_data(data, from_rows=True, titles_from_data=True)
# 添加 LineChart 对象到工作表中,指定折线图的位置
ws.add_chart(chart, "C12")
# 引用工作表的表头数据
cats = Reference(worksheet=ws, min_row=2, max_row=2, min_col=2, max_col=5)
# 设置类别轴的标签
chart.set_categories(cats)
# 设置 x 轴的标题
chart.x_axis.title = "季度"
# 设置 y 轴的标题
chart.y_axis.title = "利润"
# 改变线条颜色
chart.style = 48
# 保存文件
wb.save(file_path)
# 在终端提示表格绘图结束
print('恭喜你,工作表中的图绘制成功!')
运行效果:
在分析项目、功能拆解前,先认识一下Excel图的元素。
X、Y轴的标题:图的坐标轴分为X轴(水平轴)、Y轴(垂直轴),其标题说明了坐标轴的内容。如下图所示:
类别轴、值轴:坐标轴还可以分为类别轴和值轴。值轴用于描述数量,标签一般是数字;类别轴用于描述类别,标签一般为类别名,如下图的“第n季度”。
图例:说明图中数据系列的含义。在下图中,图例说明相应颜色折线的含义,比如:深褐色折线描述了项目A的利润变化。
简单了解Excel图的元素后,我们开始项目的分析和拆解。
先回顾一下如何使用Microsoft Excel为多个Excel文件绘制折线图。
首先,打开一个Excel文件,绘制利润走势折线图,过程分为两步:
一、折线图绘制;
二、折线图信息及样式的优化。
其中,折线图绘制包括三个步骤:确认图的类型;引用表格的数据;设置图在工作表的位置。
折线图信息及样式的优化包括三个步骤:修改类别轴的标签;添加X轴、Y轴的标题;修改图的样式。
最后,依次打开其他Excel文件,重复实现折线图绘制、折线图信息及样式的优化。
其实,利用Python绘制折线图时,也对应着这两步:折线图绘制、折线图信息及样式的优化。
由此,该项目可以拆解为四大功能块:循环打开Excel文件、折线图绘制、折线图信息及样式的优化、保存Excel文件。
项目的关键问题在于:LineChart对象
、Reference对象
的学习,实现折线图绘制、折线图信息及样式的优化。
然后,结合已学的知识for循环
、os.listdir()
完成循环打开Excel文件,工作簿对象.save()
完成保存Excel文件。
最后,将四个功能块合并,就可以为52个事业部的Excel表格绘制折线图。
折线图绘制功能块包括三个步骤:确定图的类型、引用表格中的数据、设置图在工作表的位置。
接下来,我会讲解各步骤相关的知识点。最后,利用所学知识实现折线图绘制功能块。
openpyxl 可以绘制条形图、折线图等图。在openpyxl.chart
模块中,每个类型的图都有对应的类。
通过chart = LineChart()
,得到LineChart对象
(LineChart的意思是:折线图),相当于确认图的类型为折线图。
同理,通过chart = BarChart()
可以得到BarChart对象
(BarChart的意思是:条形图)。
综上,LineChart对象
、BarChart对象
都可以称为图表对象。
需要注意的是,在实例化LineChart类
前,不要忘了从openpyxl.chart
中导入LineChart
。
这个步骤的实现,需要讲解较多的新知识:Reference类、LineChart对象.add_data()。
在Python中,通过实例化openpyxl.chart
中的Reference类
(Reference中文翻译为:引用),完成表格数据的引用。
例如:Reference(worksheet=ws, min_row=3, max_row=9, min_col=1, max_col=5)
引用了工作表对象ws中第3行到第9行、第1列到第5列矩形区域的数据。
那Reference 类
中的各参数代表什么意思?
参数worksheet
比较好理解,指明被引用数据所在的工作表对象。
参数min_row
、max_row
、min_col
、max_col
:指明被引用数据的区域。
其中,min_row指明数据区域的起始行,max_row、min_col、max_col指明终止行、起始列、终止列。如下图所示。
【温馨提示】区域包括起始行、终止行、起始列、终止列
通过实例化Reference类
,引用“事业01部.xlsx”中第 3 行的数据。
实现代码:
from openpyxl import load_workbook
from openpyxl.chart import Reference, LineChart
# 读取工作簿
wb = load_workbook('./事业01部.xlsx')
# 读取工作簿中的活跃工作表
ws = wb.active
# 实例化 LineChart 类
chart = LineChart()
# 实例化Reference类,创建Reference对象,赋值给变量data。引用第3行的数据。
data = Reference(worksheet=ws, min_row=3, max_row=3, min_col=1, max_col=6)
当取一行数据时,起始行和终止行是同一行。
通过实例化Reference类
引用表格的数据后,还需要把被引用的数据添加到LineChart对象
。
这时, LineChart对象.add_data()
方法派上用场了。
例如,Linechart对象.add_data(data, from_rows=True, titles_from_data=True),将被引用的数据data
添加到LineChart对象
中。
第一个参数是被引用的数据,它是Reference对象
。
参数from_rows
,参数titles_from_data
又是什么意思呢?
参数from_rows
的值可以是True
或False
,默认值是False
。我们尝试给参数from_rows
设置不同的值理解该参数的意义。
数from_rows小结:
一、from_rows(中文翻译为:来自行)。当from_rows设置为True时,引用区域的每行数据绘制一条折线。
二、当from_rows设置为False时,引用区域的每列数据绘制一条折线。
参数titles_from_data的值也只能是True
或False
,默认值是False
。当设置不同的值,折线图会是怎么样的呢?
所以,当titles_from_data = False
时,只需要引用绘制折线的数据。
当titles_from_data = True
时,则需要多引用表格的数据来命名图例。
如下图中,多引用了表格的A列:项目A、项目B、项目C
来命名图例。
引用表格中的数据步骤涉及的知识已讲解完:
1)Reference类:Reference(worksheet, min_row, max_row, min_col, max_col)
2)add_data()方法:LineChart对象.add_data(Reference对象,from_rows, titles_from_data)
了解了如何去引用数据来绘制折线图后,还需要确定好折线图在表格中放置的位置。
绘制完图后,需要使用方法工作表对象.add_chart()
将图添加至工作表,并设置图的位置。
add_chart()的使用很简单:工作表对象.add_chart(图表对象,参数anchor)
。
第1个参数,指明被添加至工作表的图表对象,这里是LineChart
对象。
第2个参数 anchor:设置图在工作表的位置。
例如,ws.add_chart(chart, "C12")
,将绘制后的图表对象chart
添加到工作表对象ws
中,图的左上角位于单元格C12
。
至此,我们已经可以在工作表上引用数据绘制出一个折线图,并放置在工作表的固定位置了。也就实现了功能块2:折线图绘制。
练习绘制折线图:
绘制项目A~项目G的利润变化,需要以项目名命名图例。
涉及到的知识点有:
实现代码:
from openpyxl import load_workbook
from openpyxl.chart import LineChart, Reference
# 读取工作簿
wb = load_workbook('./事业01部.xlsx')
# 读取工作簿中的活跃工作表
ws = wb.active
# 实例化 LineChart 类,得到 LineChart 对象, 并赋值给变量chart
chart=LineChart()
# 实例化 Reference 类,引用工作表的部分数据。将Reference对象赋值给变量data
data=Reference(worksheet=ws,min_row=3,max_row=9,min_col=1,max_col=5)
# 添加被引用的数据到 LineChart 对象
chart.add_data(data,from_rows=True, titles_from_data=True)
# 添加 LineChart 对象到工作表中,折线图的左上角位于单元格 C12。
ws.add_chart(chart,'C12')
# 保存文件
wb.save('./事业01部.xlsx')
运行效果: