Python操作Excel的Xlwings教程(二)

在上篇文章《操作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相关的知识,对于这些概念觉可以这样理解和记忆:

App相当于Excel程序(前文的进程截图);

Book相当于Excel的工作簿;

Range相当于单元格,也可以是单元格区域;

多个Excel程序则由Apps表示,单个为App;

多个工作簿用Books表示,单个为Book;

多个工作表用Sheets表示,单个为Sheet。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352