【Python】 更棒的Excel操作模块xlwings
【xlwings】
說(shuō)到Python操作Excel,有好多模塊都可以支持這個(gè)工作。比如最底層的win32模塊不僅可以操作Excel,還可以操作其他一眾windows的軟件。
其他的比較熟悉的有xlrd,xlwt和xlutils這三個(gè)。分別負(fù)責(zé)Excel文件的讀、寫、讀寫轉(zhuǎn)換工作。雖然一般情況下的Excel操作都可以通過(guò)這三個(gè)模塊來(lái)完成,但是還是有很多不便的地方。比如單元格格式的寫入和讀取很麻煩,通過(guò)xlutils將一個(gè)Excel讀取再寫入到一個(gè)新文件中時(shí)格式也不會(huì)被一起復(fù)制過(guò)去。
另外最近我遇到的需求就是,基于一個(gè)Excel模板,往里面填充數(shù)據(jù)。雖然可以將模板轉(zhuǎn)化為xlwt的代碼寫死在生成腳本中,但是每次都要重新生成一個(gè)文件未免太過(guò)麻煩,而且一個(gè)格子一個(gè)格子地寫入會(huì)讓代碼量飛速上漲。。無(wú)奈之下另尋他路,嘗試著用了xlwings這個(gè)模塊。
?
■ 基本使用
和xlrd等不同,xlwings設(shè)計(jì)的基礎(chǔ)理念不是面向單個(gè)的Excel文檔進(jìn)行的,而是可以處理一個(gè)包含了多個(gè)Excel文檔的“Excel項(xiàng)目”。通過(guò)建立其app等邏輯組分概念,可以讓整個(gè)Excel項(xiàng)目可以更加有序方便地進(jìn)行計(jì)算和互相通訊。xlwings中設(shè)計(jì)的各個(gè)模型的概念層級(jí)如下圖所示:
其中App是作為一個(gè)邏輯的分組,一個(gè)Book可以認(rèn)為對(duì)應(yīng)一個(gè)Excel文檔,Sheet對(duì)應(yīng)一張工作表,Range對(duì)應(yīng)具體表中的一片區(qū)域的內(nèi)容。首先,下面是一個(gè)最為常見(jiàn)的,打開(kāi)一個(gè)Excel文檔并進(jìn)行處理的簡(jiǎn)單過(guò)程:
import xlwings as xwbook = xw.Book('/path/to/test.xlsx') # 此時(shí)界面上會(huì)彈出Excel窗口,如果test.xlsx文件不存在則會(huì)報(bào)錯(cuò),如果test.xlsx已經(jīng)被打開(kāi),直接返回這個(gè)文件對(duì)象print book.name,book.fullname # 打印文件名和絕對(duì)路徑 print book.app # 可以查看book所在哪個(gè)APP print book.sheets # 又是一個(gè)類列表結(jié)構(gòu),存放各種Sheet對(duì)象 book.activate() # 如果Excel沒(méi)有獲得當(dāng)前系統(tǒng)的焦點(diǎn),調(diào)用這個(gè)方法可以回到Excel中去 book.close() # 關(guān)閉Excel文檔,但只是關(guān)閉文件本身,不關(guān)閉excel程序。。若要關(guān)閉Excel程序則需要調(diào)用響應(yīng)APP實(shí)例的kill方法。經(jīng)過(guò)試驗(yàn),先調(diào)用close會(huì)導(dǎo)致默認(rèn)創(chuàng)建的app實(shí)例自動(dòng)消失,從而無(wú)法調(diào)用kill,從而關(guān)不掉Excel所以最好的辦法不是調(diào)用這個(gè)close而是調(diào)用app.kill()。
sheet = book.sheets[0] # 其他獲取sheet對(duì)象的方法還有book.sheets['sheet_name']
?
上面說(shuō)到了獲取一個(gè)具體的sheet,然一個(gè)sheet可以調(diào)用的方法有:
sheet.activate sheet.charts sheet.indexsheet.api sheet.clear sheet.namesheet.autofit sheet.clear_contents sheet.namessheet.book sheet.delete sheet.picturessheet.cells sheet.impl sheet.range...等等
?
其中activate,autofit,cliear_content等這些方法都還挺有意思的。最為核心的方法應(yīng)該就是range了,通過(guò)它可以獲取到具體的某一段范圍的數(shù)據(jù)。
例如sheet.range('A1')獲取到A1單元格的對(duì)象,通過(guò)調(diào)取此對(duì)象的value屬性,就可以讀取/改變單元格的值,并且這一切都不會(huì)影響單元格本身的格式。
更加imba的一種做法是sheet.range('A1:C3')這樣的形式可以一次性獲取到一個(gè)區(qū)域內(nèi)所有單元格的對(duì)象。調(diào)取其value對(duì)象的話得到的也是一個(gè)二維列表形式的數(shù)據(jù)集合,可以形象方便地把Excel中的數(shù)據(jù)映射到python中來(lái)。對(duì)于設(shè)置數(shù)據(jù)時(shí),傳入數(shù)據(jù)可以是一個(gè)不符合指出區(qū)域規(guī)定的結(jié)構(gòu),但是這樣結(jié)果會(huì)比較微妙。。建議實(shí)驗(yàn)
需要指出的是和xlrd一樣,讀取value時(shí)合并單元格只在其左上角的子單元格中有值,其余的和未填寫的單元格一樣,都是None。
?
■ 對(duì)于range,能做的還有更多
除了簡(jiǎn)單的調(diào)用value和為value賦值來(lái)讀寫Excel外,還有如下接口可以使用
range.add_hyperlink range.clear_contents range.countrange.address range.color range.current_regionrange.api range.column range.endrange.autofit range.column_width range.expandrange.clear range.columns range.formula...等等
?
一些接口的用法提示:
range.add_hyperlink('https://www.baidu.com','百度')
?????? range.color = (128,128,128)??? RGB通道顏色,可獲取or設(shè)置
range.row/column 獲取第幾行/列,注意是第幾而不是下標(biāo)
range.formula 可以設(shè)置計(jì)算表達(dá)式,用來(lái)進(jìn)行表內(nèi)計(jì)算
range.current_region 返回當(dāng)前range所在區(qū)域的區(qū)域表達(dá),這個(gè)比較難描述,好比一個(gè)Excel中互相連接的單元格都是連城一片,兩個(gè)片之間沒(méi)有任何相鄰就是互相獨(dú)立的。
range.count 返回這個(gè)range中共有多少單元格,合并單元格仍然按未合并的算
range.offset(a,b) 獲取到當(dāng)前range向右a格,向下移動(dòng)b格同樣大小的那片區(qū)域,ab可以為負(fù)值
range.rows/columns 返回行/列的各個(gè)range對(duì)象
■ 關(guān)于App
其實(shí)App還沒(méi)有仔細(xì)研究過(guò),簡(jiǎn)單來(lái)說(shuō),當(dāng)通過(guò)xw.Book創(chuàng)建一個(gè)實(shí)例的時(shí)候,默認(rèn)向xw.apps中添加一個(gè)App實(shí)例,而book就屬于這個(gè)App。
如上面所說(shuō),解決Excel程序無(wú)法關(guān)閉的問(wèn)題可以用這個(gè)app實(shí)例的kill方法。app.kill()可以把Excel程序連同文件一并關(guān)閉。另外,如果不想讓Excel程序跳出來(lái)則可以置app.visible=False,即時(shí)設(shè)置即時(shí)生效。
由于通常我們的操作基于Book類對(duì)象,當(dāng)完成操作book.save之后,如果想要關(guān)掉Excel,可以調(diào)用book.app.kill()或者book.app.quit(),但在這之前不要book.close(),否則會(huì)報(bào)錯(cuò)哦。(推薦使用quit,使用kill的話有些excel打開(kāi)軟件比如WPS會(huì)記錄下非正常的退出狀態(tài),當(dāng)再次打開(kāi)這個(gè)文檔的時(shí)候就會(huì)報(bào)錯(cuò)說(shuō)有錯(cuò)誤。如果第二次仍然使用xlwings打開(kāi),而錯(cuò)誤提示的對(duì)話框占據(jù)了焦點(diǎn),會(huì)使得xlwings無(wú)法正常使用)。
?
轉(zhuǎn)載于:https://www.cnblogs.com/franknihao/p/8514634.html
總結(jié)
以上是生活随笔為你收集整理的【Python】 更棒的Excel操作模块xlwings的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 钢材销售系统
- 下一篇: 15行Python 仿百度搜索引擎