处理excel,选择vba还是python?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理excel,选择vba还是python?相关的知识,希望对你有一定的参考价值。

python如果只考虑处理excel,也就学一下基础语法,再学习几个模块即可。知识体系也不是很庞大。而且这个技术,后边还可以干一些其他事! 参考技术A 作为表格软件的先驱,Excel可以说给我们的日常办公,做出了不可磨灭的贡献。随着excel功能的扩大,VBA、python等各类编程语言,开始被应用于excel当中。
于是乎,关于处理excel,该选择VBA还是python的问题,开始充斥互联网界。毕竟,个人的学习能力有限,想要同时掌握VBA和python还是有一定难度的。
就算是excel,很多人都只敢说会使用,不敢说精通。
虽然VBA作为程序的自动化脚本而存在,是为了提高程序的自动化程度。可是,操作起来,那就事与愿违了。比如,自定义类必须写在类模块,不能写到模块或者Excel对象中;在类模块中自定义类时,需要注意对象和基本类型在写法上的差异。
先不去说python,我们来透过现象去看本质。
excel的主要应用场景包括:数据存储、数据计算、数据分析、图表展示数据、自动化办公(这个跟VBA内嵌于excel中有关)等。
看到这里,你想到了什么?恭喜你,那意味着,你将喜提语言基础全家桶(变量、数据类型、运算符、选择和循环语句、函数、模块)等。python和VBA的语言全家桶,虽然看上去差异很大,但是本质上它们相差无几。本质上都是编程语言,即使有难易之分,却也不分伯仲。只要你是编程语言,那么就很少有人敢说精通,为了某个功能,翻来覆去地修改,碍于面子,还不愿请教比自己年轻2岁的excel大神。
工作量明显增加,效率却得不到显著提高,容易陷入闭门造车的困境。
格局太小,我们何不妨把眼光放长远一点,不学VBA,python等各类编程语言,一样能处理excel的工作。
如果有一款类似excel,功能相似或功能更强大的电子表格,还省去学习VBA、python等编程语言的苦痛,那该有多好!
您可不敢说,那还真的有。
这款电子表格还是国产的,它叫云表,同时也是一个开发工具。(文末有免费获取方式)
云表是从excel中延伸来的,它还和excel的“老对手”金山系WPS有着颇深的渊源,其研发团队是从金山系WPS研发团队走出来的。
只要excel能实现的功能,云表基本上都能实现,甚至功能更为强大。
你可以想象一下,在酷似excel的操作界面中,沿用excel拖拖拽拽的方式,画画表格,配以工作流、权限控制(excel很难做到)、流程审批、填表公式,业务公式等,一揽子如ERP、WMS、OA等企业级管理软件或系统,便“唰唰唰”地出来了。
而数据分析、数据透视、报表、报工、闹钟提醒,工程计划日志等办公工作,对于云表来讲,就是小儿科,用“秒”来描述其完成速度,完全不过分。
有人要出来杠了,还不是从学习一个工具,变成学习另一个工具吗?
确实如此。但是,学习成本大大降低啊!不用学VBA或python等编程语言全家桶,只需要你懂得业务,就能轻轻松松上手,而且还可以根据自身需要随时随地打开,把系统或者表单修改成自己想要的功能。
你学大半年,我不敢说你能精通VBA、python,但是,云表,不写一行代码,你完全可以将工具转变成适应你,而不是你去适应工具。像中国电信、华为、中铁16局等各行企业,早已为云表验证这一说法。
处理excel,该选择VBA,还是python,亦或其他,相信你已心中有数!
点击下方“了解更多”,即可免费获取云表
如果您觉得有用,别忘了一键三连哦,感谢您的评论转发与收藏!
文|Mondy
关键词:excel VBA python 数据 表单 电子表格 软件 编程语言
参考技术B 如果你没有语言基础,并且想学习一门语言来处理Excel表格,那么我的建议是不要学VBA,也不要学Python,C#和

VB.net
任学一门就可以了,然后再学习点SQL的基础,基本上数据处理你就能搞定了,数据处理归根结底还是需要数据库支持,而不规范的表格数据注定不会有很多。

不建议学VBA理由
可能很多人会反对这个说法,我只能说适合自己的就是好的吧,VBA作为一种脚本语言至少是20年前的东西了,20多年来没有什么更新,不论是在语法上还是在理念上都和现代的

VB.net
、C#差异很大,基本上只适用于在office平台上解决些问题,对操作office有更好的支持,仅此而异;如果你学习的是一门现代的语言,不论是C#还是
VB.net
,通过第三方库操作office只是它的一种用法而已,能干的事情会更多,处理起来速度更快,效率更高,有人会拿VBA支持事件来说事,但是要知道但凡需要界面事件等来操作的,编制成软件后录入才是更好的方法,而不是在一个表格中折腾。

软件连接数据库非常容易,不论是C/S还是B/S模式,给用户的只是客户端界面,数据永远在公司服务器的数据库中,安全性更好,VBA想实现很难吧。

如果你已经会

Vb.net或c#
,那么也只是可以看得懂部分的VBA代码,能写点简单的,如果只会VBA,那么面对
VB.net和 c# 编程,基本上需要重头进行学习,原来的那些VBA知识基本上没用。

不建议学Python的理由
Python这两年很热很火,但是基本上不适合于普通用户使用,特别是在windows平台上,先说开发环境有很多不说,还有不同的版本支持,需要调用的第三方库,中间的各种不兼容等,如果对linux没一点了解,还是不要碰它,Python实现图像界面有一定的难度,不如C#友好,写好代码后制作成可执行软件用户交互差。

python的强大之处在于它的第三方库非常非常的多,通常只需要很少的代码量就能解决问题,但它对普通用户不友好。

c#和
VB.net

这个也是微软的亲儿子,VS的IDE说第二没人敢说第一,上手容易,界面也相当友好,通过简单拖拽就能做出一个图形界面,再引用第三方库

Spire.Xls
、NPOI等处理起来Excel更是方便快捷,你完全可以把Excel中的数据读入到DataSet中,然后在DataGrid中显示出来进行处理,或者在后端处理,也可以直接读单元格来处理,最后处理好的结果你是想保存到数据库中还是想存回原有的表格中,或者是根据某些条件批量生成大量的Excel文件,都是相当容易的事情。

最终想学哪个决定在自己,但是在学习之前找个VBA的手册和C#的手册都浏览一下,就明白自己该学习哪个了。
参考技术C 作为表格软件的先驱,Excel可以说给我们的日常办公,做出了不可磨灭的贡献。随着excel功能的扩大,VBA、python等各类编程语言,开始被应用于excel当中。
于是乎,关于处理excel,该选择VBA还是python的问题,开始充斥互联网界。毕竟,个人的学习能力有限,想要同时掌握VBA和python还是有一定难度的。
就算是excel,很多人都只敢说会使用,不敢说精通。
虽然VBA作为程序的自动化脚本而存在,是为了提高程序的自动化程度。可是,操作起来,那就事与愿违了。比如,自定义类必须写在类模块,不能写到模块或者Excel对象中;在类模块中自定义类时,需要注意对象和基本类型在写法上的差异。
先不去说python,我们来透过现象去看本质。
excel的主要应用场景包括:数据存储、数据计算、数据分析、图表展示数据、自动化办公(这个跟VBA内嵌于excel中有关)等。
看到这里,你想到了什么?恭喜你,那意味着,你将喜提语言基础全家桶(变量、数据类型、运算符、选择和循环语句、函数、模块)等。python和VBA的语言全家桶,虽然看上去差异很大,但是本质上它们相差无几。本质上都是编程语言,即使有难易之分,却也不分伯仲。只要你是编程语言,那么就很少有人敢说精通,为了某个功能,翻来覆去地修改,碍于面子,还不愿请教比自己年轻2岁的excel大神。
工作量明显增加,效率却得不到显著提高,容易陷入闭门造车的困境。
格局太小,我们何不妨把眼光放长远一点,不学VBA,python等各类编程语言,一样能处理excel的工作。
如果有一款类似excel,功能相似或功能更强大的电子表格,还省去学习VBA、python等编程语言的苦痛,那该有多好!
您可不敢说,那还真的有。
这款电子表格还是国产的,它叫云表,同时也是一个开发工具。(文末有免费获取方式)
云表是从excel中延伸来的,它还和excel的“老对手”金山系WPS有着颇深的渊源,其研发团队是从金山系WPS研发团队走出来的。
只要excel能实现的功能,云表基本上都能实现,甚至功能更为强大。
你可以想象一下,在酷似excel的操作界面中,沿用excel拖拖拽拽的方式,画画表格,配以工作流、权限控制(excel很难做到)、流程审批、填表公式,业务公式等,一揽子如ERP、WMS、OA等企业级管理软件或系统,便“唰唰唰”地出来了。
而数据分析、数据透视、报表、报工、闹钟提醒,工程计划日志等办公工作,对于云表来讲,就是小儿科,用“秒”来描述其完成速度,完全不过分。
有人要出来杠了,还不是从学习一个工具,变成学习另一个工具吗?
确实如此。但是,学习成本大大降低啊!不用学VBA或python等编程语言全家桶,只需要你懂得业务,就能轻轻松松上手,而且还可以根据自身需要随时随地打开,把系统或者表单修改成自己想要的功能。
你学大半年,我不敢说你能精通VBA、python,但是,云表,不写一行代码,你完全可以将工具转变成适应你,而不是你去适应工具。像中国电信、华为、中铁16局等各行企业,早已为云表验证这一说法。
处理excel,该选择VBA,还是python,亦或其他,相信你已心中有数!
点击下方“了解更多”,即可免费获取云表
如果您觉得有用,别忘了一键三连哦,感谢您的评论转发与收藏!
文|Mondy
关键词:excel VBA python 数据 表单 电子表格 软件 编程语言

实战,Python处理Excel比Vba快100倍,媳妇连连夸赞今晚不用再跪搓衣板

背景

最近经历了一次把vb脚本改造成python脚本,并获得性能提升数倍的过程,当然,这个过程也不是一帆风顺,中间也经历了一些波折,但是,也收获了一波新的认知。正好最近有时间,姑且写下来记录一下。

什么是VB

话说现在的年轻人,听说过这个编程语言的应该不多了。VB是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。从任何标准来说,VB都是世界上使用人数最多的语言,它源自于BASIC编程语言,也属于高级语言的一种了。只是现在各大应用场景以及被Java、Go、Python等编程语言瓜分一空,VB基本很少人知道了。

什么是VBA

而VBA和VB又有点差别,Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件,比如excel、powerpoint、word等。

故事的开端

而本次故事的场景,就是在excel中编写vba宏脚本,而这个场景的需求,则来源于笔者的媳妇。笔者的媳妇平时的工作大部分时间都是跟excel打交道,也就是很多人口中的“表姐”,因此excel的各种高级操作比如vlookup、数据透视等,也算是应用的炉火纯青了。

可偏偏事不如人愿,企业中的业务总是会越来越复杂,老板的要求也会越来越高,渐渐地,有一些需求我媳妇用她炉火纯青的技巧也搞不动了。于是她把希望寄托在了我这个廉价劳动力身上,毕竟传说中的搞IT的,可是什么都能干的。

于是大概从几年前,我开始陆陆续续用vba写宏,帮助媳妇处理类似复杂的数据计算问题,说到这里,我翻了翻我的朋友圈,竟然有据可查:2017年就开始了!有图为证:

也就是从那个时候开始,媳妇搞不定的复杂数据处理问题,就扔给我用vba来搞。要知道,对于一个写惯Java语言的人来说,对vba这种语言真的是一百种不习惯,尤其是那个土得掉渣的开发环境,话不多说,上图:

有没有一种年代复古风的感觉!这还是最新版本的,老版本的连调试功能都没有,任何问题都得默念加各种打日志排查,更不用说高级点IDE都具备的自动补全、提示、重构等功能了,所以,用这个玩意写代码的效率那真是一言难尽。

就这样被媳妇的需求折磨了几年,好在这几年的需求也没复杂到哪里去,一路也就忍过来了。可最近一次媳妇扔过来的需求,可着实把我可累了一把。

详细的需求就不说了,大概就是对一个excel的两个sheet进行计算,其中一个sheet将近1万行,两外一个sheet数据量倒不多300多行,但是格式比较复杂,各种合并和拆分单元格(见下图),而要计算的需求复杂度相比之前也上升了一个台阶。

拿到需求后,我还是按照惯例用vba来写,大概耗费了一个周末的时间搞定了,虽然交了差。但是面对未来可能越来越复杂的需求,我的心里打了鼓,vba的开发效率和复杂数据处理需求的矛盾越来越突出,而且这次写的脚本,性能上也问题很大,整个处理过程耗时10分钟之巨,如下图所示:

作为一个自认优秀且有良心的搞IT的,怎么能够忍受这种开发效率和运行效率,二话不说,我要优化它!

怎么优化呢?话说在大数据处理领域,Python可算是TIOBE排行榜上,数一数二的利器了,尤其是在AI大热的背景下,Python在TIOBE排行榜上的地位是逐渐蹿升,除了大数据领域,Python在web开发、Excel办公、科学计算和数据可视化等方面也表现优秀。好了,就用Python搞!

Python优化过程

大概的优化思路是这样的:用Python的xlwings库来处理excel数据的读写,但数据的计算就不用它直接搞了,效率会比较低,而是用Pandas库在内存中进行数据的复杂计算,然后将计算后的结果写回excel

思路其实很简单,但实操的过程却不是完全一帆风顺,接下来就是整个优化的过程

第一版优化

因为用Pandas把数据读到内存后,是一个DataFrame,我们可以很容易的拿到这个DataFrame的行数和列数,类似一个数组一样可以方便的遍历,因此第一版的实现,使用的是标准的遍历的方法来实现,核心代码如下:

读取excel

import pandas as pd
import xlwings as xw

#要处理的文件路径
fpath = "datas/joyce/DS_format_bak.xlsm"

#把CP和DS两个sheet的数据分别读入pandas的dataframe
cp_df = pd.read_excel(fpath,sheet_name="CP",header=[0])
ds_df = pd.read_excel(fpath,sheet_name="DS",header=[0,1])
......

标准遍历方法

for j in range(len(cp_df)):
    
    cp_measure = cp_df.loc[j,'Measure']
    cp_item_group = cp_df.loc[j,'Item Group']
    
    if cp_measure == "Total Publish Demand":
        
        for i in range(len(ds_df)):
            #如果cp和ds的item_group值相同
            if cp_item_group == ds_df.loc[i,('Total','Capabity')]:
            
......

写入excel

#保存结果到excel       
app = xw.App(visible=False,add_book=False)

ds_format_workbook = app.books.open(fpath)
ds_format_workbook.sheets["DS"].range("A3").expand().options(index=False).value = ds_df 

ds_format_workbook.save()
ds_format_workbook.close()
app.quit()
......

说到这里插一句,大家还记得我前面提到的那个各种拆分和合并单元格的复杂格式吗,这种格式在Pandas里又叫多层索引(MultiIndex),这种结构下数据的查询和操作,比普通的表格要复杂,大概处理代码类似下面:

#用元组的方式来定位某一列
ds_total_capabity1 = ds_df.loc[k,('Total','Capabity.1')]
#
#获取多层索引某一层数据的方法
ds_month = ds_df.columns.get_level_values(0)[k]
ds_datatime = ds_df.columns.get_level_values(1)[k]
......

因为这个话题跟本文章无关,这里就不展开了,有兴趣大家自己去学习了解。

这一版写完后,信心满满地执行脚本,但是立马被现实浇了一盆冷水,执行时间竟然要555秒,也就是9分多钟,并没有比vba快多少,如下图:

为什么会这样!Python不是号称数据处理利器吗。我们仔细看一下打印的日志输出,可以看到主要的瓶颈在循环计算这块,耗时469+42 = 517秒,基本所有时间都用在这里。当然,从日志也可以看到,读写excel的性能也一般,但并不是性能瓶颈。对于性能优化的一般准则是:数据驱动+二八原则,也即通过数据分析发现瓶颈,即占用80%耗时的地方,然后有针对性地优化该瓶颈。

内存中的循环计算为什么这么慢呢?遇事不决问度娘,通过一番搜索,终于让我找到一个官方解释,原来DataFrame(数据帧)是具有行和列的Pandas对象(objects),如果使用循环,则将遍历整个对象,Python无法利用任何内置函数,而且速度非常慢,建议用Pandas内置函数:iterrows(),iterrows()为每行返回一个Series,因此将DataFrame迭代为一对索引,将感兴趣的列作为Series进行迭代,这使其比标准循环更快。

既然官方这么说,那我们还怀疑什么,那就试试呗。

第二版优化

有了解决方案,那就好办了,无非就是把代码里所有用到标准循环的地方,改成用iterrows(),改动的地方代码如下:

#根据CP和DS表的Item_group值做lookup,计算DS表的Delta值
for index_i,cp_row in cp_df.iterrows():
    
    #获取CP表的Item_group和siteid值
    cp_item_group = cp_row['Item Group']
    siteid = cp_row['SITEID']
    key = cp_item_group + "-" + siteid  
        
    for index_j,ds_row in ds_df.iterrows():
        
        #获取DS表的Item_group值
        ds_item_group = ds_row[('Total','Capabity')]
        
        if ds_item_group != "" and cp_item_group == ds_item_group :
           
            iner_iter_df = ds_df.loc[index_j:index_j+5]
        ......

改完后执行,果然,效率提升了一些,见下图:

整体耗时337秒,也就是5分多钟,比前一版提升40%,看起来还不错。但是,作为一名优秀的IT人,不能满足于既有的成绩,要不断追求极致。于是,就有了第三版优化。

第三版优化

其实第三版优化的思路,还是追求更快地遍历效率,Pandas除了iterrows()之外,据说还有一个更快的apply()方法,能够对DataFrame的每一行逐行应用自定义函数,且遍历性能更好。于是,第三版的核心代码如下:

def Cal_Delta_Loi_Iter_In_Cp(data):
    global cal_delta_loi_cp_row
    cal_delta_loi_cp_row = data
    #获取CP表的Item_group和siteid值
    global cp_item_group
    cp_item_group = cal_delta_loi_cp_row['Item Group']
    siteid = cal_delta_loi_cp_row['SITEID']
    global key 
    key = cp_item_group + "-" + siteid
    ds_df.apply(Cal_Delta_Loi_Iter_In_Ds,axis=1)
    
#开始计算Delta和LOI值
cp_df.apply(Cal_Delta_Loi_Iter_In_Cp,axis=1)
......

按apply()改完代码再次执行,这次执行效率果然又上了一个台阶,如下图:

整体耗时147秒,也即2分多钟,相比上一版再次提升56%,Very Done!

小小总结一下

优化到这里,我们可以看到,使用Python的Pandas类库,并且使用较高性能的内置函数,能够很大程度提升数据处理的性能。但是,我们从前面打印出的日志也能看到,Python提供的xlwings库,在读写excel方面的性能缺很难说优秀,相比vba来说更是差了一大截。

VBA虽然数据结构少,数据计算速度慢,但访问自己Excel的Sheet,Range,Cell等对象却速度飞快,这就是一体化产品的优势。VBA读取Excel的Range,Cell等操作是通过底层的API直接读取数据的,而不是通过微软统一的外部开发接口。所以Python的各种开源和商用的Excel处理类库如果和VBA来比较读写Excel格子里面的数据,都是处于劣势的(至少是不占优势的)。

因此,Python处理Excel的时候,就要把Excel一次性地读取数据到Python的数据结构中,而不是大量调用Excel里的对象,不要说频繁地写入Excel,就是频繁地读取Excel里面的某些单元格也是效率较低的。

关于Python技术储备

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、Python必备开发工具

三、精品Python学习书籍

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

四、Python视频合集

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、Python练习题

检查学习结果。

七、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

以上是关于处理excel,选择vba还是python?的主要内容,如果未能解决你的问题,请参考以下文章

excel vba 选择性粘贴并设置为真文本?

从VBA中的excel中选择多列

如何在Excel VBA 中读写word文档 步骤

没有选择的excel vba冻结窗格

Excel VBA结束选择没有选择案例

使用 VBA 选择和突出显示 Excel 行