1. 程式人生 > >【Python】 更棒的Excel操作模塊xlwings

【Python】 更棒的Excel操作模塊xlwings

對象 當前 offset mage charts add 更多 讀取 代碼

【xlwings】

  說到Python操作Excel,有好多模塊都可以支持這個工作。比如最底層的win32模塊不僅可以操作Excel,還可以操作其他一眾windows的軟件。

  其他的比較熟悉的有xlrd,xlwt和xlutils這三個。分別負責Excel文件的讀、寫、讀寫轉換工作。雖然一般情況下的Excel操作都可以通過這三個模塊來完成,但是還是有很多不便的地方。比如單元格格式的寫入和讀取很麻煩,通過xlutils將一個Excel讀取再寫入到一個新文件中時格式也不會被一起復制過去。

  另外最近我遇到的需求就是,基於一個Excel模板,往裏面填充數據。雖然可以將模板轉化為xlwt的代碼寫死在生成腳本中,但是每次都要重新生成一個文件未免太過麻煩,而且一個格子一個格子地寫入會讓代碼量飛速上漲。。無奈之下另尋他路,嘗試著用了xlwings這個模塊。

■  基本使用

  和xlrd等不同,xlwings設計的基礎理念不是面向單個的Excel文檔進行的,而是可以處理一個包含了多個Excel文檔的“Excel項目”。通過建立其app等邏輯組分概念,可以讓整個Excel項目可以更加有序方便地進行計算和互相通訊。xlwings中設計的各個模型的概念層級如下圖所示:

技術分享圖片

  其中App是作為一個邏輯的分組,一個Book可以認為對應一個Excel文檔,Sheet對應一張工作表,Range對應具體表中的一片區域的內容。首先,下面是一個最為常見的,打開一個Excel文檔並進行處理的簡單過程:

import xlwings as xw

book 
= xw.Book(/path/to/test.xlsx) # 此時界面上會彈出Excel窗口,如果test.xlsx文件不存在則會報錯,如果test.xlsx已經被打開,直接返回這個文件對象 print book.name,book.fullname # 打印文件名和絕對路徑 print book.app # 可以查看book所在哪個APP print book.sheets # 又是一個類列表結構,存放各種Sheet對象 book.activate() # 如果Excel沒有獲得當前系統的焦點,調用這個方法可以回到Excel中去 book.close() #
關閉Excel文檔,但只是關閉文件本身,不關閉excel程序。。若要關閉Excel程序則需要調用響應APP實例的kill方法。經過試驗,先調用close會導致默認創建的app實例自動消失,從而無法調用kill,從而關不掉Excel
所以最好的辦法不是調用這個close而是調用app.kill()。
sheet = book.sheets[0] # 其他獲取sheet對象的方法還有book.sheets[‘sheet_name‘]

  上面說到了獲取一個具體的sheet,然一個sheet可以調用的方法有:

 sheet.activate       sheet.charts         sheet.index
 sheet.api            sheet.clear          sheet.name
 sheet.autofit        sheet.clear_contents sheet.names
 sheet.book           sheet.delete         sheet.pictures
 sheet.cells          sheet.impl           sheet.range
...等等

  其中activate,autofit,cliear_content等這些方法都還挺有意思的。最為核心的方法應該就是range了,通過它可以獲取到具體的某一段範圍的數據。

  例如sheet.range(‘A1‘)獲取到A1單元格的對象,通過調取此對象的value屬性,就可以讀取/改變單元格的值,並且這一切都不會影響單元格本身的格式。

  更加imba的一種做法是sheet.range(‘A1:C3‘)這樣的形式可以一次性獲取到一個區域內所有單元格的對象。調取其value對象的話得到的也是一個二維列表形式的數據集合,可以形象方便地把Excel中的數據映射到python中來。對於設置數據時,傳入數據可以是一個不符合指出區域規定的結構,但是這樣結果會比較微妙。。建議實驗

  需要指出的是和xlrd一樣,讀取value時合並單元格只在其左上角的子單元格中有值,其余的和未填寫的單元格一樣,都是None。

■  對於range,能做的還有更多

  除了簡單的調用value和為value賦值來讀寫Excel外,還有如下接口可以使用

 range.add_hyperlink  range.clear_contents range.count
 range.address        range.color          range.current_region
 range.api            range.column         range.end
 range.autofit        range.column_width   range.expand
 range.clear          range.columns        range.formula
...等等

  一些接口的用法提示:

  range.add_hyperlink(‘https://www.baidu.com‘,‘百度‘)

range.color = (128,128,128) RGB通道顏色,可獲取or設置

  range.row/column  獲取第幾行/列,註意是第幾而不是下標

  range.formula  可以設置計算表達式,用來進行表內計算

  range.current_region  返回當前range所在區域的區域表達,這個比較難描述,好比一個Excel中互相連接的單元格都是連城一片,兩個片之間沒有任何相鄰就是互相獨立的。

  range.count  返回這個range中共有多少單元格,合並單元格仍然按未合並的算

  range.offset(a,b)  獲取到當前range向右a格,向下移動b格同樣大小的那片區域,ab可以為負值

  range.rows/columns  返回行/列的各個range對象

  

■  關於App

  其實App還沒有仔細研究過,簡單來說,當通過xw.Book創建一個實例的時候,默認向xw.apps中添加一個App實例,而book就屬於這個App。

  如上面所說,解決Excel程序無法關閉的問題可以用這個app實例的kill方法。app.kill()可以把Excel程序連同文件一並關閉。另外,如果不想讓Excel程序跳出來則可以置app.visible=False,即時設置即時生效

  

【Python】 更棒的Excel操作模塊xlwings