从事数据工作的人都知道,企业每天都要做很多报表,这个过程当中会涉及到很多手工操作和常规性报表。为了减少人工介入,节省工作时间,我们会想办法将一部分操作用工具或代码来替代,这个过程就称为报表自动化。
报表自动化如何实现?
报表自动化的起点是能对接数据源,期间能自动化的生成事先设计好格式的报表,最终通过邮件自动推送。具体流程可以分为3个步骤:
1、对接数据源:从数据库或数据仓库中取数,生成原始数据sheet或其他工具对接所需要的数据文件格式。
2、设计报表框架:要展示哪些数据指标,什么样的表头格式,是否需要用到图表、函数、空间等,最好手动设计好报表的版式。
3、自动化过程实现:自动化分为两块,自动化的数据处理和自动化发送邮件。
用什么工具实现?
实现的路径有很多。精通Excel的可以通过写VB脚本来实现,如果你会Python那更好不过,Python可以实现很多自动化设计,可以从读取到输出数据一步到位。更直接的,可以用报表工具来实现。所谓三流用Excel,二流用Python,一流直接用现成的报表工具!
我之前做数据报表的流程,一般是先打开数据库,然后运行一段写好的 SQL 语句,把数据查询出来,然后再把数据复制到 Excel 中并制作报表。后面用了 Python 之后,很多工作都可以自动化。再到后面公司上了BI报表系统,做报表就更加自动化和专业化了。
这里简述下后两者实现报表自动化的方法。
Python报表自动化
一次自动化的报表制作,通常需要经历这样几个步骤:
连接并操作数据库
利用Pandas进行数据清洗和处理
操作Excel并开发报表
设置定时邮件发送给相关人员
1、连接并操作数据库
Python可以连接并操作各种数据库,包括 Oracle、PostgreSQL、MySQL、SQL Server 等等。不同的数据库,需要安装不同的第三方模块,比如说,要操作 Oracle,那么通常需要先安装 cx_Oracle:
pip install cx_Oracle
在开始操作数据库之前,需要先创建一个数据库引擎,然后再连接数据库:
from sqlalchemy import create_engine # 创建数据库引擎engine = create_engine('oracle://user:password@ip_address:1521/orcl') # 连接数据库con = engine.connect()
如果你有数据库账号拥有创建表的权限,那么就可以对数据库进行增删改查的操作。
# 增 con.execute(''insert into usr(id, name) values(1, 'Jim')'') con.execute(''insert into usr(id, name) values(2, 'Joe')'') # 删 con.execute('delete from usr where id = 1') # 改 con.execute(''update usr set name = 'Jack' where id = 2'') # 查 sql = 'select id, name from usr where id = :id' import pandas as pd df = pd.read_sql(sa.text(sql), engine, params={'id': 2}) df
另外,利用Python去执行各种SQL 语句,自动完成更加复杂的数据库操作。
2、数据处理+自动化报表
在Python执行SQL后,取出以下原始数据:
想要实现的报表如下,这张日报表是用来监控每一天的销售、发货和用户反馈情况。
代码如下:
# PART2 自动化报表 data = pd.read_excel(r'C:Userscindy407Desktopdelivery_data.xlsx',sheet_name='原始数据') # pandas行和列全部展示 pd.options.display.max_rows=Nonepd.options.display.max_columns=None # 1、订单、销售金额、发货订单数 df1 = data.groupby(['销售时间'])['订单号'].count() # 销售订单数 df2 = data.groupby(['销售时间'])[['数量','销售金额']].sum() # 销量和金额 df3 = data.groupby(['销售时间'])['交货时间'].count() # 交货订单数 # 2、发货天数分布 # 日期相加减,需先转变成日期格式,使用apply data['销售时间1'] = data['销售时间'].apply(lambda x: datetime.strptime(x.replace('/','-'),'%Y-%m-%d')) data['交货时间'] = data['交货时间'].apply(lambda x: datetime.strptime(x.replace('/','-'),'%Y-%m-%d')) data['送货时间'] = (data['交货时间'] - data['销售时间1']).apply(lambda x: x.days) # 连续型字段分成多区间,用pd.cut bin = [0,14,30,60,90,120] data['送货天数'] = pd.cut(data['送货时间'] ,bins=bin) # 按销售时间维度进行统计 df4 = data.groupby(['销售时间','送货天数'])['销售时间'].count().unstack() # 3、用户反馈情况 df5 = data.groupby(['销售时间','货品用户反馈'])['销售时间'].count().unstack() # 4、数据按列拼接 df = pd.concat([df1,df2,df3,df4,df5],axis=1) # 5、修改列名 df.columns=['销售订单数','销售件数','销售金额','已交货订单数','30-60天交货占比','90-120天交货占比','60-90天交货占比','拒收比例','质量合格比例','返修比例'] # 6、将数值转化成百分比 df['60-90天交货占比'] = df['60-90天交货占比']/df['已交货订单数'] df['90-120天交货占比'] = df['90-120天交货占比']/df['已交货订单数'] df['30-60天交货占比'] = df['30-60天交货占比']/df['已交货订单数'] df['拒收比例'] = df['拒收比例']/df['已交货订单数'] df['质量合格比例'] = df['质量合格比例']/df['已交货订单数'] df['返修比例'] = df['返修比例']/df['已交货订单数'] # 7、将汇总和明细存入同一个EXCEL writer = pd.ExcelWriter(r'C:Userscindy407Desktopdaily_report.xlsx') df.to_excel(writer,sheet_name='汇总数据') data.to_excel(writer,sheet_name='明细数据',index=False) writer.save()
3、设置定时邮件发送给相关人员
以上就是一个典型的日报表,源数据不变,报表格式不变,就可以通过这段脚本自动生成,生成的报表也可以实现推送,利用Python实现自动化发送邮件,使用发送邮件的协议SMTP,可以在邮箱的设置页面中开启SMTP。
用QQ邮箱来举例,自动化发邮件的完整代码如下:
import smtplib from email import encoders from email.header import Header from email.mime.text import MIMEText from email.utils import parseaddr,formataddr from email.mime.application import MIMEApplication from email.mime.multipart import MIMElMultipart from email.mime.base import MIMEBase asender='[email protected]'#发件人邮箱 areceiver='[email protected]'#收件人邮箱 acc='[email protected]'#抄送人邮箱 asubject='2020年XX月XX日报表'#邮件主题 from_addr='[email protected]'#邮件主题 password='XXXX'授权码 #邮件设置 msg=MIMEMultipart() msg['Subject']=asubject msg['to']=areceiver msg['Cc']=acc msg['from']='数据分析不是个事儿' #邮件正文 body='您好,这是今天的数据,请查收' #添加邮件正文 msg.attach(MIMEText(body,'plain','utf-8')) #添加附件 x1sxpart=MIMEApplication(open(r''C:UsersAdministratorDesktop今日数据情况.x1sx'','rb').read())xlsxpart.add header('Content-Disposition', ’attachment', filename='今日数据情况.x1sx’) msg.attach(xlsxpart) #设置邮箱服务器地址以及端口 smtp_server='smtp.qq.com' server=smtplib.SIMTP(smtp_server,25) server.set_debuglevel(1) #登录邮箱 server.login(from_addr,password) #发送邮件 server.sendmail(from_addr, areceiver.split(',')+acc.split','), msg.as_string()) server.quit()
做表的过程是通过python操作excel,这是很基础的用法,更高级的做法是用pandas替代excel进行处理再存入Excel。
以上,利用Python可以解决企业日常60%的报表自动化。那剩余的40%呢?
一方面,并不是所有报表都是需要或者适合做自动化的。像日报,周报,这种频率性很强的东西,就需要自动化。而那些不同活动的效果数据,每次都不一样,这样的做自动化就没有太大意义。
另一方面,一些复杂的报表,尤其是非数据类的报表用Python开发也不适合。比如图1这种报表格式很复杂的,用代码凭空构思难度很大;图2一些用于打印货单的凭证,需要涉及到数据填报和读取;还有图3这种能够用于分析联动钻取的动态报表,开发量很大。
图1
图2
图3
再者,如果说企业数据量涉及千万上亿条数据,python加载数据就会卡顿。数据量大的企业报表需求量也大,一年可能要做上千张报表,用Python开发基本就是招程序员堆人力,这样的研发做着做着离职率也是极高的,整体的效率就会成问题。
随着机器变得越来越智能,许多工作都变得越来越自动化,也会推动着我们寻求更加敏捷的工具。其实市面上有很成熟的报表工具、报表控件可以用来开发报表,一旦企业数据业务成熟到一定阶段,都会上这一套系统,典型如FineReport。
相比较Python,不要写代码,报表设计有类似Excel的可视界面。相比较Excel,可直接对接数据库读取写入,能操作大数据量,性能可随数据量适配。
报表工具实现报表自动化
企业级的系统追求效率,要让绝大多数没有技术基础的人能用,所以他们在开发工具的时候就会将很多功能零代码封装好。那FineReport是怎么实现报表自动化的呢?
简述几个报表自动化的功能点吧
SQL可视界面连接并操作数据源
可视化报表模板设计器
自动化的数据分发与提醒
1、可视化SQL语句编辑界面连接操作数据源
操作数据源无论是连接数据库还是Excel,Python每次都要写一串代码。FineReport操作数据库有一个可视化SQL语句编辑面板,在与数据库链接成功后能看到数据库表和字段,然后拖拽数据表和字段到编辑页面就可以生成SQL语句。其也能对接各种数据库和数据仓库。也能导入Excel数据集、Jason数据集等。
SQL做数据的人都懂,有些人习惯在SQL里处理一些数据,那就可以在取数环节处理一部分表和数据,就像一个内置的navicat。
2、可视化报表模板设计器,三种制作模式覆盖所有报表类型
读完库取完数之后就是作报表。Excel做的是一个个单张报表,FineReport做的是一个个报表哦模板,也就是说一些固定化格式的报表就可以设计统一的报表模板样式,一劳永逸,后续只要维护维护模板就好。
如图,FineReport的主面板就是表格模板设计器,表格式、功能操作、函数等都类似Excel,不同点在于Excel是对单个数据操作,这里是对数据字段操作,将需要的数据字段拖到表格中,再配以各种可视化的属性设置。
设计器针对有三种报表设计模式:普通报表、聚合报表、决策报表。
普通报表模式最贴近Excel,用来做大部分报表包括基础报表、中国式复杂报表,运算上能多SHEET和跨SHEET计算,兼容EXCEL公式。聚合报表模式用来做一些不规则的报表,像运单表,一些保险单之类的,这种报表要频繁的合并、拆分单元格,工作极其繁琐。决策报表模式用来做可视化仪表板、驾驶舱、管理看板等,就像一个空白画布,把各种可视化图表拖拽到界面搭建仪表板。
拖拽制作复杂报表
固定报表的查询,可导出
可视化报表
3、自动化的数据分发与提醒
FineReport是有一个平台的,上面可以挂在报表,也有一些平台功能,比如自动化里常用到的报表推送,就可以用它的定时调度与消息提醒功能,就定时生成报表结果,将每日/每月的生产报表推送给对应的人员。发送方式有邮件、短信、平台、微信、钉钉等。根本不需要写代码。
报表自动化只是FineReport的一部分特性,SQL编辑、报表页面设计、参数查询设计、填报设置、多层钻取等基本都是不要写代码。相比excel和Python开发,更快速和高效,配置好数据,1到2个小时就可开发出一张报表。
最后
最后,咱们数据从业者要想避免沦为“取数工具”、“表哥”、“表姐”,势必是要将报表工作自动化的,这样才能有更多的时间去思考和解决业务相关的问题,而不是陷入重复使用工具的手动操作。
对于制作数据报表这项工作而言,其最终价值也是赋能业务,所以需要从实际业务应用场景出发,去高效制作一套数据管理模版,并推动业务方大大利用。这需要一个数据平台来承接,需要报表工具来承担,也是企业利用数据道路上不可阻挡的趋势。