Excel既是一种祝福,也是一种诅咒。当涉及到足够小的数据和足够简单的操作时,Excel是王者。然而,一旦你发现数据非常多时,它就会变成一种痛苦。当然,你可以使用Excel VBA来解决这些问题,但是在2020年,你感到庆幸,因为你不必这么做!
如果有办法把Excel和Python结合在一起,给Excel插上翅膀那就更好了!一个名为xlwings的python库允许您通过VBA调用python脚本并在两者之间传递数据。
为什么要将Python与Excel VBA集成?
事实上,你可以在VBA中做任何事情。所以,如果是这样,为什么要使用Python?嗯,有很多原因。
- 你可以在Excel中创建自定义函数,而不必学习VBA
- 用户在Excel的使用中感觉很舒服
- 使用Python可以显著加快数据操作的速度
- 在Python中,几乎所有东西都有库(机器学习、数据科学等)
准备使用xlwings
我们需要做的第一件事,就像我们想使用的任何新库一样,就是安装它。这是非常容易做到的,通过两个命令,我们很快就会建立起来。所以,继续输入你的终端:
pip install xlwings
下载并安装库后,我们需要安装Excel集成部分。确保已关闭所有Excel实例和任何终端类型:
xlwings addin install
如果没有遇到错误,你应该能够继续。但是在Win10 with Excel 2016上,人们经常会看到以下错误:
xlwings 0.17.0[Errno 2] No such file or directory: 'C:甥敳獲costaAppDataRoamingMicrosoftExcelXLSTARTxlwings.xlam'
如果你是一个幸运的人来经历上述错误,你所需要做的就是创建丢失的目录。通过使用mkdir命令,您可以很容易地做到这一点。就我而言,我做到了:
mkdir C:甥敳獲costaAppDataRoamingMicrosoftExcelXLSTART
假设excel与python库的集成安装成功,你将注意到的主要区别是excel:
为xlwings启用用户定义函数
首先,我们需要加载Excel加载项,你可以点击Alt,L,H,然后导航到上面的目录来加载插件。完成后,您应该能够看到以下内容:
最后,需要启用对VBA工程对象模型的信任访问。你可以通过导航到“文件>选项>信任中心>信任中心设置>宏设置”来执行此操作:
xlwings入门
从Excel到Python(和返回)有两种主要方式。第一个是直接从VBA调用Python脚本,另一个是通过用户定义的函数。让我们快速看一下两者。
为了避免任何混乱,并有正确的设置每次,xlwings提供创建您的Excel电子表格,准备好了。然后让我们使用这个功能。使用终端,我们导航到喜欢的目录并键入:
xlwings quickstart ProjectName
我叫这是MyFirstPythonXL。上面的命令将在预先导航的目录中创建一个新文件夹,其中包含一个Excel工作表和一个python文件。
打开.xlsm文件时,你会注意到一个名为xlwings.conf的新Excel工作表。如果要覆盖xlwings的默认设置,你只需重命名此工作表并删除起始下划线。这样,我们都准备好开始使用xlwings了。
VBA到Python
在我们开始编码之前,让我们首先确保我们都在同一页上。要打开我们的Excel VBA编辑器,请按Alt+F11。这将返回以下屏幕:
这里要注意的关键是,此代码将执行以下操作:
- 在与电子表格相同的位置查找Python脚本
- 查找与电子表格同名的Python脚本(但扩展名为.py)
- 在Python脚本中,调用函数“main()”
不用再费心了,让我们来看看如何使用它的几个例子。
例1:在Excel之外操作,并返回输出
在本例中,我们将看到如何在Excel之外执行操作,但随后将结果返回到电子表格中。这可以有无限多的用例。
我们将从CSV文件中获取数据,对所述数据进行修改,然后将输出传递给Excel。让我们回顾一下这有多简单:
首先,VBA代码:
我把它与默认设置完全保持不变。
然后,Python代码:
import xlwings as xwimport pandas as pddef main(): wb = xw.Book.caller() df = pd.read_csv(r'C:empTestData.csv') df['total_length'] = df['sepal_length_(cm)'] + df['petal_length_(cm)'] wb.sheets[0].range('A1').value = df
结果如下:
示例2:使用Excel输入驱动操作
在本例中,我们将从Excel读取输入,用Python对其进行处理,然后将结果传递回Excel。
更具体地说,我们要读一个问候语,一个名字和一个文件位置,在那里我们可以找到笑话。然后,我们的Python脚本将从文件中随机抽取一行,并返回一个笑话。
首先,VBA代码:
我把它与默认设置完全保持不变。
然后,Python代码:
import xlwings as xwimport randomdef random_line(afile): line = next(afile) for num, aline in enumerate(afile, 2): if random.randrange(num): continue line = aline return line'Function from: stackoverflowdef main(): wb = xw.Book.caller() listloc = str(wb.sheets[0].range('B3').value) fhandle = open(listloc, encoding = 'utf-8')wb.sheets[0].range('A5').value = wb.sheets[0].range('B2').value + ' ' + wb.sheets[0].range('B1').value + ' here is a joke for you' wb.sheets[0].range('A6').value = random_line(fhandle)
结果如下:
带xlwings的用户定义函数
我们将以与以前几乎相同的方式更改python文件中的代码。为了将某些内容转换为Excel用户定义函数,我们只需在函数所在的行之前包含“@xw.func”:
Python代码:
import xlwings as xw@xw.funcdef joke(x): wb = xw.Book.caller() fhandle = open(r'C:Templist.csv') for i, line in enumerate(fhandle): if i == x: return(line)
结果如下:
结论
我想你会同意这是一个非常好用的小工具。如果你和我一样,更喜欢使用Python而不是VBA,但需要使用电子表格,那么这可能是一个非常好的工具。
--END--
欢迎大家关注我们的公众号:为AI呐喊(weainahan)
为了帮助更多缺少项目实战的同学入门Python,我们在头条上创建了一个专栏:《7小时快速掌握Pthon核心编程》,欢迎大家点击下方链接或者阅读原文进行试看~