標籤:none 往裡面 應該 address img 工作表 python log color
【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 xwbook = xw.Book(‘/path/to/test.xlsx‘)# 此時介面上會彈出Excel視窗,如果test.xlsx檔案不存在則會報錯,如果test.xlsx已經被開啟,直接返回這個檔案對象print book.name,book.fullname # 列印檔案名和絕對路徑print book.app # 可以查看book所在哪個APPprint 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