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

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

轉載自:https://www.cnblogs.com/franknihao/p/8514634.html

【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,即時設定即時生效。

  由於通常我們的操作基於Book類物件,當完成操作book.save之後,如果想要關掉Excel,可以呼叫book.app.kill()或者book.app.quit(),但在這之前不要book.close(),否則會報錯哦。(推薦使用quit,使用kill的話有些excel開啟軟體比如WPS會記錄下非正常的退出狀態,當再次開啟這個文件的時候就會報錯說有錯誤。如果第二次仍然使用xlwings開啟,而錯誤提示的對話方塊佔據了焦點,會使得xlwings無法正常使用)。