Excel、Python靠边站,这才是自动生成表格最快的方法
作者:finereport
浏览:5,849
发布时间:2023.9.14
最近在跟隔壁部门闲聊的时候,我发现会有这样的情况。他们跟我吐槽说,每天都要花很多时间做报表,但我发现其实他们80%的报表都是机械、重复式的手工操作,最夸张的一张报表需要花两个小时才能更新完。作为报表老油条,我就问他们为什么要用双手累死累活更新表格,却不考虑去学自动生成表格呢?
为了搞清楚这个原因,我观察了很久,得出了三点主要原因:
问题1:不知道原来还可以实现自动生成表格
用Excel表格手工做表格,其实弊端很多。①工作效率低下,一张每天都需要更新数据的表格,如果需要人工操作,就得每天花上2、3个小时一个个更新单元格 ②人为干预环节太多,这就意味着准确率无法保证,出错率极高。
所以不管是从提升效率,还是减少报表出错的角度来说,我们都应该减少手工操作,把这些机械、重复的工作交给技术去做。那什么样的表格才适合用自动生成?
问题2:不知道什么样的表格,适合用自动生成?
我们可以把表格分成两类,做个简单的数学题来看看,自动化是不是真的方便。
第一类是一次性的表格,这种报表要花15分钟做,且只做一次,而做自动化要30分钟,这样算下来,如果做自动化的话会亏15分钟,必然不划算。
第二类是常规性的表格,每个月要做4次。这种报表做一次要30分钟,用自动化要60分钟,开发完成后,每次做要5分钟。以三个月为时间段计算的话,按照原来的流程,要在这份报表上花30*12=360分钟,但用自动化后,只要花60+5*11=115分钟,节省了68%的时间。并且时间跨度越大,节省时间越多。
其实说白了,就是重复性高、内容固定的表格,最适合用来做成自动生成表格。
问题3:不知道用什么工具能实现自动生成表格
实现报表自动化的路径其实有很多,但一般来说,最常用的有3种。
一、精通Excel,就写VBA来实现报表自动化
优点:①Excel自带,无需下载,与Excel之间的交互很友好;②易分享,可以把做好的模板分享给同事,不是每个人的电脑上都会装python,但是每个人的电脑上都有Excel
缺点:①入门难:VBA代码太不友好了,很容易就从入门到放弃 ②数据处理量有限:一旦数据量到十几万行的话,Excel就撑不住了,可能你花了三天三夜做好的报表,就直接卡到打不开了。
二、掌握Python,就写代码来实现自动生成表格
优点:能够实现很多自动化设计,从读取数据到输出数据都可以完成
缺点:①需要操作者学会写代码,学习成本比较高。②数据处理量有限:如果说企业数据量涉及千万上亿条数据,一年可能要做上千张报表,python加载数据就会极其卡顿,影响工作。③一些复杂的报表,尤其是非数据类的报表用Python开发也不适合,比如打印货单的凭证、发票套打。
说了这么多,还是举个例子来实践一下吧
一次自动化的表格制作,通常需要经历这样几个步骤:
1、连接并操作数据库
Python可以连接并操作各种数据库,包括Oracle、PostgreSQL、MySQL、SQL Server 等等。不同的数据库,需要安装不同的第三方模块,比如说,要操作Oracle,那么通常需要先安装 cx_Oracle:
pip install cx_Oracle
如果你有数据库账号拥有创建表的权限,那么就可以对数据库进行增删改查的操作。
2、数据处理+自动化报表
在Python执行SQL后,取出原始数据
想要实现的报表如下,这张日报表是用来监控每一天的销售、发货和用户反馈情况
部分代码如下:
# PART2 自动化报表
data = pd.read_excel(r'C:\Users\cindy407\Desktop\delivery_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)
3、设置定时邮件发送给相关人员
以上就是一个典型的日报表,源数据不变,报表格式不变,就可以通过这段脚本自动生成,生成的报表也可以实现推送,利用Python实现自动化发送邮件。
三、学会简单SQL,用表格工具一步实现自动生成表格
刚刚举了Excel和Python的例子,但其实这两个方法各有优缺点,那有没有一种工具能融合两个方法的优点,又同时能避开它们的缺点?其实市面上已经有很多成熟的报表工具,可以解决这个问题,我拿知名度较高的报表工具FineReport举例。
相比较Python,在都能一步取数、输出数据的前提下,FR不需要写几百行的复杂代码,只需要学会简单的SQL语言,就能取数设计报表,绝大多数没有代码基础的人也能上手,且因为用的是类Excel的操作界面,使用习惯也不会有太大的改变。再相较Excel,FR能够直接从数据库取数,数秒处理几万行的数据,不用再苦苦等着加载报表。
说了这么多,还是和上面一样,举个例子,看FR是如何实现自动生成表格,让打工人摆脱报表折磨的。其实很简单,只需解决三个难题:
- 第一步:表格如何取数
- 第二步:表格如何自动生成,实现自动生成表格
- 第三步:表格完成后,如何自动发送
第一步:表格如何取数
对于大部分公司来说,生产进度只能人工整理汇总Excel表格,数据乱且杂,报表人的取数工作肉眼可见的困难。这就是为什么大家在做日报周报的时候,想要的数据取不出来,想填的数据填不进去,费了半天时间整理的一堆报表只能烂在自己手里。
但用FineReport直连数据库功能,就可以很好解决这个问题。
简单来说,就是FineReport在数据库的支撑下搭建了一个数据中心,想做报表时就可以直接从库中取数;同理你也可以将其集成到OA系统、ERP系统之中,随时取数、找数做报表。
除此之外,FineReport还拥有数据填报功能,数据部门可以根据业务人员提的需求来设计填报模板。业务人员通过设计好的模板录入数据,数据就会同步到数据库中。
第二步:表格如何自动生成,实现自动生成表格
解决了取数的问题后,我希望我只需要做一次日报,然后将其作为模板,以后再需要时可以直接调出来用。
其实,利用FineReport就可实现这个功能,你可以将制作好的模板保存在平台中,再需要制作日报时就可以直接将模板调出来,大大减少重复制作表格的流程和时间,将繁琐复杂的日报变成再简单不过的取数填数。
同时对于不同的表格适用对象,你可以用FineReport设计出不同类型的模板,比如总部一个模板,分厂一个模板,不同的班组有不同的模板,通过在几个模板之间设置钻取关系后就可以实现对企业报表数据的分级把控,需要时就直接调用。
同时,我们做日报周报的时候不免要涉及很多数据和项目进展情况,这时候直白枯燥的数字很难直接反映数据情况,而这时候就可以通过FineReport的仪表板、进度条等功能,用可视化图表来反映生产进度的健康情况,同样只需要调用模板填数就可以。
有了模板,很多人还是会有一个问题,有的业务人员不想用系统录入数据,还是习惯用excel填报,这种情况该怎么实现自动生成表格呢?
很简单,FineReport有多种方式来确保在基层的生产数据的录入,既可以支持固定样式模板的填报报表,也支持excel模板的直接导入。
比如,IT人员可以根据业务人员的需要设计填报模板,业务人员只要定期打开模板填报生产计划或者生产结果即可;或者IT人员也可以为业务人员设计基于固定EXCEL表格的导入模板,只需设计好数据库与模板的表结构,业务人员即可一键导入日常工作中在excel中的数据。
第三步:表格完成后如何自动发送
一般情况下企业每天的表格需要按时发给领导,但是每次都需要手动上交表格,一旦临时有事,还要麻烦其他同事帮自己交表格。
这个问题可以用FineReport的定时调度功能解决,在系统设置好定时任务,它会按时将做好的报表发送邮件或者短信给查看报表的人。
我们刚刚讲了那么多,最后我们再回到表格本身看。其实对于大多数企业来说,表格是需要定期制作、发布的,这就导致我们不得不定期去制作相同的表格。但这样低效率、高人力成本的做表方式早就被淘汰了。
相反,自动生成表格流程不仅可以减少人力、时间成本,还可以让企业把主要精力放在数据分析上,真正把数据的价值用到位,让数据推动业务,辅助管理者进行决策,而不是仅仅让数据的价值停留在手机和邮箱里。
报表工具产品更多介绍:www.finereport.com