本篇目录:
Excel的基本组成
一份报表自动化的流程
报表自动化实战
将不同的文件进行合并
Excel的基本组成
下图是Excel的中各个部分的组成关系,我们工作中每天会处理很多Excel文件,一个Excel文件其实就是一个工作簿。你在每次新建一个Excel文件时,文件名都会默认是工作簿x,其中x就是你新建的文件个数。而一个工作簿里面又可以有多个Sheet,不同Sheet之间是一个独立的表。每一个Sheet里面又由若干个单元格组成。每一个单元格又有若干的元素或属性,我们一般针对Excel文件进行设置最多的其实就是针对单元格的元素进行设置。
而针对单元格元素进行设置的主要内容其实就是如下图菜单栏中显示,比如字体、对齐方式、条件格式等内容。本书也是按照Excel菜单栏中的各个模块进行编写。
一份自动化报表的流程
下图是我整理的做一份自动化报表需要经历的流程,主要分为5个步骤:
第一步是对要做的报表进行步骤拆解,这个步骤拆解和用不用工具或者是用什么工具没有直接关系,比如做报表的第一步一般都是收集数据,这个数据可能是线下人员记录在纸质笔记本上的,也可能是存储在Excel表里面的,还有可能是存储在数据库里面的。会因为数据源的类型或者是存储方式不同,对应的收集数据方式会不一样,但是收集数据这个步骤本身是不会变的,这个步骤的目的就是把数据收集过来。
第二步是去想第一步里面涉及到的每一个具体步骤对应的代码实现方式,一般都是去找对应每一步的代码,比如导入数据的代码是什么样的,再比如重复值删除的代码是什么样的。
第三步是将第二步中各个步骤对应的代码进行组合,组合成一个完整的代码。
第四步是对第三步完整代码得出来的报表结果进行验证,看结果是否正确。
第五步就是等待调用,看什么时候需要制作报表了,然后就将写好的代码执行一遍就行。
其实报表自动化本质上就是让机器代替人工做事情的过程,我们只需要把我们人工需要做的每一个步骤转化成机器可以理解的语言,也就是代码,然后让机器自动去执行,这其实就是实现了自动化。
报表自动化实战
这一节给大家演示下在实际工作中如何结合Pandas和openpyxl来自动化生成报表。
假设我们现在有如下一份数据集:
现在我们需要根据这份数据集来制作每天的日报情况,会主要包含三方面:
- 当日各项指标的同环比情况;
- 当日各省份创建订单量情况;
- 最近一段时间创建订单量趋势
接下来分别来实现这三部分。
当日各项指标的同环比情况;
我们先用Pandas对数据进行计算处理,得到各指标的同环比情况,具体实现代码如下:
#导入文件
import pandas as pd
df = pd.read_excel(r'D:\Data-Science\share\excel-python报表自动化\sale_data.xlsx')
#构造同时获取不同指标的函数
def get_data(date):
create_cnt = df[df['创建日期'] == date]['order_id'].count()
pay_cnt = df[df['付款日期'] == date]['order_id'].count()
receive_cnt = df[df['收货日期'] == date]['order_id'].count()
return_cnt = df[df['退款日期'] == date]['order_id'].count()
return create_cnt,pay_cnt,receive_cnt,return_cnt
#假设当日是2021-04-11
#获取不同时间段的各指标值
df_view = pd.DataFrame([get_data('2021-04-11')
,get_data('2021-04-10')
,get_data('2021-04-04')]
,columns = ['创建订单量','付款订单量','收货订单量','退款订单量']
,index = ['当日','昨日','上周同期']).T
df_view['环比'] = df_view['当日'] / df_view['昨日'] - 1
df_view['同比'] = df_view['当日'] / df_view['上周同期'] - 1
df_view
运行上面代码会得到如下结果:
上面只是得到了各指标的同环比绝对数值,但是我们一般的日报在发出去之前都要做一些格式调整的,比如调整字体之类的。而格式调整就需要用到openpyxl库,我们需要将Pandas库中DataFrame格式的数据转化为适用openpyxl库的数据格式,具体实现代码如下:
from openpyxl import Workbook
from openpyxl.utils.dataframe import dataframe_to_rows
#创建空工作簿
wb = Workbook()
ws = wb.active
#将DataFrame格式数据转化为openpyxl格式
f