在上篇文章《操作Excel的Xlwings教程(一)》中介绍了Python 中操作Excel的一些模块,重点介绍了Xlwings的一些基本操作。本次推文将继续上次的知识点,将介绍Xlwings的一些API知识,并展示一些小例子,让大家可以跟着教程进行实际的操作。
一、 Apps
先来看一点点代码
import xlwings as xwapp1 = xw.App()app2 = xw.App()print(xw.apps)
第二、三行代码建立了两个创建工作簿实例,运行后发现:默认的打开了两个工作簿,这两个工作簿会显示的存在于你的桌面。
如果不想显示,我们在创建实例的时候可以使用参数:wx.App(visible=False)
第四行输出为:Apps([<Excel App 9244>, <Excel App 19476>]),其中[9244]和[19476]即为这两个实例的PID。
其他方法:
xw.apps.active # 返回活动的应用程序
Active:很多小伙伴可能对激活不是很清楚,举个例子:我们再使用Excel软件的时候,可以打开好几个工作簿,但是我们不能对打开的工作簿同时进行操作,只能操作其中一个。这个Active的作用就是激活其中的一个你想使用的工作簿,将它变为活动工作簿。
二、App
如何找出当前打开的所有Book对象呢?
我们先建立几个workbook,看看都有什么效果:
for i in range(1,4):
wookbook = xw.Book() #创建新的App并在创建的App新建Book
print(wookbook)
print(xw.books) #当前打开的所有Book对象的集合
输出如下:
<Book [工作簿1]>
<Book [工作簿2]>
<Book [工作簿3]>
Books([<Book[工作簿1]>,<Book [工作簿2]>, <Book [工作簿3]>])
可知:xw.Book()会新建工作簿,这里默认会新建一个App,即打开Excel程序,并新建一个工作簿。而且Book这种方式则会打开多个窗口,之前所说的App.books.open方式则不会。
顺便提一下引用工作簿的方法:(使用工作簿前要引用工作簿)
xw.Book('工作簿1') # 通过Book
xw.books['工作簿1'] # 通过books
(1)wb.app.calculate() # Calculates all open books.
(2)wb.app.calculation = ‘manual’ # 设置计算模式
(3)wb.app.display_alerts = True # 默认值为True。False的情况下执行操作的时候会忽略Excel的提示和警报消息(即弹窗信息)
(4)wb.app.screen_updating = False # 禁止屏幕更新(刷新)
(5)wb.app.range(cell1, cell2=None) # 获取单元格
(6)wb.app.selection # 将所选单元格作为Range返回
(7)xw.App().version # 返回Excel程序版本号
三、Books
首先要知道所有的Book构成Books,即Books是所有Book对象的集合,在第二节中已有描述。那么Books中有哪些常用的方法或属性呢?我们在示例中进行简单的说明:
import xlwings as xw
app1 = xw.App()
app2 = xw.App()
print(xw.books)
book_keys = xw.apps.keys()
first_book = book_keys[0] # 取列表的第一个值
print(xw.apps[first_book].books) # 应用
print(app1.books.active) # 激活一个Book
print('count1:',app1.books.count) # 先打印一下app1下Book的总数
app1.books.add() # 增加一个新的Book,此新建的Book将自动变成被激活的Book
print('count1:',app1.books.count) # 再次打印app1下Book的总数
app1.books.open('1.xlsx') # 打开操作,如果工作簿未打开则打开,若它已经打开,则返回工作簿对象。
# 或指定绝对路径打开文件 app1.books.open('D:\datafile\1.xlsx')
print(app1.books.open('1.xlsx')) # 再一次打印app1下Book的总数
print('count1:',app1.books.count)
以上print的输出依次为:
此时win10系统中,资源管理器的Excel进程显示如下:
可以看出,app1下打开了3个工作簿,app2下打开了1个工作簿。若想关闭某一个app下的全部工作簿的时候,可以使用kill(),如app1.kill()。
四、Book
官网中介绍到:A book object is a member of the books collection,即Book对象是Books集合的成员。下表显示了xw.Book()和xw.books三种情况下的操作:(上篇推文也有介绍)
**Tips: **差别在于xw.Book()创建新的工作薄实例,xw.books是在活动工作薄中寻找一个实例
xw.Book()打开文件的时候,可选参数较多,具体的参数可以查看其构造函数,或者查看上篇推文《操作Excel的Xlwings教程(一)》。
方法和属性
xw.Book.activate(steal_focus=True) # True则激活最前面的窗口,并将焦点从python移交给excel
xw.Book.app # 获取创建工作簿的app对象
xw.Book.caller() # 当通过RunPython从Excel调用Python函数时引用调用的工作簿
xw.Book.set_mock_caller() # 设置当前工作薄为Python代码的调用者即set_mock_caller让Python知道谁是调用者
xw.Book.close() # 关闭工作簿而不进行保存
xw.Book.selection # 返回选定的单元格作为Range
xw.Book.macro() # 在Excel VBA中运行Sub或Function
xw.Book.name # 返回工作簿的名称
xw.Book.names # 返回一个名称集合
xw.Book.save(path=None) # 保存工作簿,可传入保存路径,同名会直接覆盖
xw.Book.sheets # 返回表示工作簿中所有工作表的工作表集</pre>
对于xw.Book.set_mock_caller()的解释此处引用网上的一段话:
“有时代码是从Python环境直接调试或调用的,没有使用Excel里面的RunPython, 这时候没有地方设定代码的调用者是谁,就运行这个函数来假装一下某个workbook就是这些代码的调用者,让Python环境与调用者能够关联起来。”
最后来看一个官网的例子
# 此代码在Excel中通过RunPython和Python直接运行import os
import xlwings as xw
def my_macro():
sheet = xw.Book.caller().sheets[0]
sheet.range('A1').value = '我爱python知识学堂'
if __name__ == '__main__':
xw.Book('1.xlsm').set_mock_caller() # 设置调用者
my_macro()
关于这个例子在后期会在解释,主要是告诉大家可以使用Python实现对Excel的操作实现。具体实现的时候我们还要搭建在Excel中运行Python的环境。关于一些操作不理解的小伙伴建议打开编译器进行实践一下哦。
五、小结
这次的推文主要介绍了Apps、App、Books和Book相关的知识,对于这些概念觉可以这样理解和记忆: