01-报表自动化
要做报表自动化,我们需要考虑清楚3个问题。
Q1,什么是报表自动化?
Q2,什么样的内容适合进行报表自动化?
Q3,如何实现报表自动化?
第一个问题,什么是报表自动化呢?之前算数都是掰手指用算筹,后来采用算盘,这是自动化;之前记账都记到纸质账本上,现在采用计算机系统,这是自动化;之前在excel中进行手动操作,后来使用函数,vba,python,sql,这也是自动化。总结一下就是,在出报告的过程中会涉及大量的手工操作,将这部分人类手工操作的工作用工具或代码代替的过程称为报表自动化。报表自动化的目的在于简化工作流程,减少人工介入,节省工作时间,提高工作效率。
第二个问题,什么样的内容适合进行报表自动化?我们来做一个简单的数学题。将报表分成两类来分析,一类是一次性的报表,这种报表你做的时候需要15分钟,且只做一次,做自动化需要30分钟,这样算下来,你如果做自动化的话会亏15分钟,不划算。第二种是常规性的报表,每个月需要出4次。这种报表你做一次需要30分钟,开发自动化需要60分钟,开发完成后每次做需要5分钟。以两个月为时间窗口计算的话,按照原来的操作流程,你每个月需要在这份报表上花费30*8=240分钟,自动化之后,你只需要花费60+5*7=95分钟,节省了60%的时间,这真是一笔划算的生意。所以就是,重复性/内容固定的报表适合用来做报表自动化。
第三个问题,报表自动化到底怎么实现呢?报表的起点是下载源数据,终点是将报告通过邮件发出。我将报表流程拆解成了3个步骤。第一步,梳理工作流程,从获取源数据开始,到最后将报告交付出去,这中间一共分几个小块呢?首先下载所需源数据,放到指定位置;整合源数据,制作成所需的报表;将报表通过邮件发送出去。第二步:设计报表体系,通过第一步流程梳理,我们可以看到报表自动化应该分成两个模块:模块一:报表制作模块,负责整合源数据,生成最终的报告;模块二:邮件发送模块,负责将报表通过邮件发送出去。第三步:自动化过程实现,我们现在考虑将第二步的两个模块集成到代码中,代替人的手工操作,解放你的双手。怎么实现呢?这里推荐使用python,因为python可以从读取数据到输出数据一步到位,确实好用。
02一个小案例
小A是公司的新媒体运营,TA每周一都需要review上周各个互联网平台上推文的浏览量。小A之前是使用excel操作,这份工作内容并不复杂,但是工作内容是重复的,且这份工作是常规性的,小A想精简一下工作流程,节省自己的工作时间。他找到了富贵帮他做这件事。富贵没有拒绝。因为富贵一旦拒绝,这篇文章就写不成了。
首先,富贵带小A先梳理了一下工作流程。
第一步,从平台上下载浏览量数据,数据格式如下。一共三列内容,第一列是推文发送渠道:分为知乎,微信,CSDN三个。第二列是浏览时间,每周一会拉取上周数据,第三列是浏览量,统计的是当天该渠道的浏览量。数据格式如下图所示。
第二步,将源数据转化为需要的周报数据,并附一个可视化图。格式如下:分析图表可以看到,需要一个转置操作,计算平均值和求和,并且画一个条形图。
废话不多说,报表模块和发邮件模块代码如下。
# -*- coding: utf-8 -*-
"""
@author: menghua.wang
"""
import pandas as pd
import numpy as np
#读取源数据
data=pd.read_excel(r'E:博客存档微信公众号第二期:Python报表自动化rawdata2019093020190930.xlsx')
channel=data['渠道'].drop_duplicates()
title = [u'推文渠道',u'星期一',u'星期二',u'星期三',u'星期四',u'星期五',u'星期六',u'星期日',u'平均浏览量',u'总浏览量']
#转置数据
report=data.pivot( index='渠道',columns='时间',values='浏览量')
report['平均浏览量']=report.mean(axis=1)
report['总浏览量']=report.sum(axis=1)
import xlsxwriter
workbook = xlsxwriter.Workbook(r'E:博客存档微信公众号第二期:Python报表自动化rawdata20190930report.xlsx')
worksheet = workbook.add_worksheet('sheet1')
chart = workbook.add_chart({'type': 'column'})
#设置表格格式
format=workbook.add_format()
format.set_border(1)
format_title=workbook.add_format()
format_title.set_border(1)
format_title.set_bg_color('#cccccc')
format_title.set_align('center')
format_title.set_bold()
format_ave=workbook.add_format()
format_ave.set_border(1)
format_ave.set_num_format('0.00')
#往表格中写数据
worksheet.write_row('A1',title,format_title)
worksheet.write_column('A2', channel,format)
report_1 = np.array(report)#np.ndarray()
list_report=report_1.tolist()#list
worksheet.write_row('B2', list_report[0],format)
worksheet.write_row('B3', list_report[1],format)
worksheet.write_row('B4', list_report[2],format)
report.ix[[1],:].values
#画图
def chart_series(cur_row):
chart.add_series({
'categories': '=Sheet1!$B$1:$H$1',
'values': '=Sheet1!$B$'+cur_row+':$H$'+cur_row,
'line': {'color': 'black'},
'name': '=Sheet1!$A$'+cur_row,
})
for row in range(2, 5):
chart_series(str(row))
chart.set_size({'width': 577, 'height': 287})
chart.set_title ({'name': u'推文浏览量周报图表'})
chart.set_y_axis({'name': '人次'})
worksheet.insert_chart('A8', chart)
workbook.close()
# -*- coding: utf-8 -*-
"""
author: menghua.wang
"""
"""
发送邮件模块
"""
#import所需模块
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.mime.application import MIMEApplication
#设置发件人收件人信息
smtpserver = 'sender.@test.com' #发件人邮箱地址
username = 'sender.@test.com' #发件人邮箱地址
password ='password' #发件人邮箱密码
sender ='sender.@test.com' #发件人邮箱地址
receiver=['receiver1.@test.com','receiver2.@test.com'] #收件人邮箱地址
#设置邮件主题
subject = 'Python自动化邮件测试'
msg = MIMEMultipart('mixed')
msg['Subject'] = subject
msg['From'] = '<sender.@test.com>'
msg['To'] = ";".join(receiver)
#添加邮件正文
text = "Dears:n附件请查收,有问题联系,谢谢!nnNAME"
text_plain = MIMEText(text,'plain', 'utf-8')
msg.attach(text_plain)
#添加附件
excelFile = 'path' #附件所在位置
excelApart = MIMEApplication(open(excelFile, 'rb').read())
excelApart.add_header('Content-Disposition', 'attachment', filename='filename') #filename用附件名称代替
msg.attach(excelApart)
#发送邮件
smtp = smtplib.SMTP()
smtp.connect('smtp.test.com') #替换成自己的邮件服务器
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
print('邮件发送成功')
smtp.quit()
富贵就这样一步步的走上了人生巅峰。