讓 Python 為你的 Excel 添加翅膀:淺談 Python 與 Excel 的最佳串接套件 xlwings

摘要

感謝大家對上一篇文章的支持,這邊容許筆者繼續為各位提供一些在整合 Python 與 Excel 這個議題上實用的知識。在上一篇文章裡提到,了解 Python 與 Excel 的串接與整合是一個我們遲早需要克服的挑戰,也是一個值得花時間研究的議題,而身為一個同時在臺大系統訓練班開設 Excel 與 Python 課程的講師,筆者希望能用一系列的文章與大家分享一些在這個議題上的一些經驗與洞見。

openpyxl 的侷限

如同在上一篇文章提到的,一個 .xlsx 檔案若是被 Excel或是其他應用程式開啟時,openpyxl 是無法把資料寫入該 .xlsx 檔案的;所以今天若每一次需要用 Python寫入資料到,就需要將 Excel 關掉一次、執行 Python 程式、再重新開啟,這樣的工作流程讓利用 openpyxl 做開發的使用者體驗變得非常糟糕。


而用 VBA 語言為 Excel 寫程式的最大好處,就是程式執行完的結果會馬上呈現在 Excel 試算表上,這種所見即所得 (WYSIWYG) 的方式會大幅增加開發者的效率。從這點來看,Python 若不能夠做到讓開發者有同樣的開發流程,只靠 openpyxl 套件現有的功能,要完全取代 VBA 語言的功能是很困難的。


這邊就來為各位介紹 xlwings,是筆者認為目前串接 Excel 最好用的 Python 套件:




至於這個套件為何好用?與其用文字和各位解釋,我們直接透過實作來體驗比較快。

安裝 xlwings

若你是使用 Anaconda, 而且 Python 版本為 3.5 或 3.5 以上,那恭喜你,xlwings 已經是 Anaconda 内建的 Python 套件之一,無須另外安裝!Python 的安裝我就不在這篇文章裡多做解釋,這邊若你是使用 Python 3,請在指令列執行:

pip install xlwings

若你是使用 Anaconda 的,請在指令列執行:

conda install xlwings

OK 環境安裝好了!

在我們繼續下去之前…

容許筆者先跟各位講解一點用 VBA 為 Excel 寫程式所需要的知識。當需要用 VBA 選擇單一個儲存格進行操作時,通常都是以 Cells 函數進行,舉個簡單的例子,今天我若想用 VBA 把 “Hello World!” 字串寫入儲存格 A1,在實作上通常是使用一個叫做 Cells 的函數:



但是我們一般在表達 Excel 的儲存格時,都是以英文字母來表示欄,所以 Cells 函數也支援以下寫法:



瞭解了 Cells() 函數後,接下來我們就比較能理解 xlwings 的厲害之處。

來實戰吧

接下來我們就來用 Python 與 xlwings 寫一個簡單的 Hello World 程式,這次我們不需要一個現有的 Excel 檔案,直接執行以下程式碼即可:




如你所見的,xlwings 會自動開啟一個新的 Excel 檔案,這邊先提一下,在使用 xlwings 做開發時,xlwings 是假設開發者的 .xlsx檔是被 Excel 應用程式開起來的,所以請先確保你的電腦已經安裝了 Excel 應用程式。


接下來我們就來實作 Hello World 吧,請你加入以下程式碼:



注意上面的寫法幾乎和 VBA 的 Cells() 函數一樣,對熟悉 VBA 的開發著來説,看到這種寫法真的是令人大呼過癮,因爲這樣大幅降低了從 VBA 語言切換到 Python 的開發門檻!


但是 xlwings 的好處不光是在語法上,現在請你試試不要關掉 Excel, 直接執行這支程式:



不同於之前 openpyxl,即使我沒有關掉 Excel 檔案,透過 xlwings ,我依然可以將值寫入到 Excel,這種能夠即時把程式執行的結果顯示在 Excel 試算表的功能,可以大幅的提升我們的開發效率 !


另外,xlwings 的 cells 函數也支援以英文字母來表示欄的寫法,所以你若覺得上面的程式碼不夠直覺,可以試試以下寫法:



備註:若你是用 Mac 電腦,很遺憾的,目前 xlwings 在 Mac 上不支援這個寫法


*備注:若你的電腦是 Mac,由於在 Mac 上 xlwings 的 cells 不支援以英文字母的方式表達欄,所以在實作上會有些微的差異,請注意這點,至於要如何用數字指定那一欄? 其實就是該欄是從最左邊數起的第幾欄,因此,A 欄相對應的數字為 1,B 欄為 2,C 欄為 3,以此類推。

若你在上述的實作中有遇到任何困難,可以參考以下影片:




恭喜你完成了你的第一個 xlwings 程式!

用 xlwings 來實作上一篇文章的日報酬率

接下來我們就用 xlwings 來實作出計算所有日報酬率的效果,這篇文章我們會繼續沿用上一篇文章的範例 Excel 檔


備註:若你是用 Mac 電腦,請點擊這個連結觀看 Mac 版程式碼


雖然我們已經成功地算出所有的報酬率了,但是要用數字觀察臺積電股價的漲跌還是有些困難,因此我們就增加一個新的功能:若當天該股票是上漲(報酬率是大於0),就把底色換成紅色;相對的,若當天該股票是下跌(報酬率是小於0),就把底色換成綠色,這個用一個簡單的迴圈與判斷式即可完成:


備註:若你是用 Mac 電腦,請點擊這個連結觀看 Mac 版程式碼



最後執行出來的結果


若你不知道如何執行本文的 Python 程式碼,可以參考以下影片:



大功告成!


希望這幾個簡單的範例能對需要整合 Python 與 Excel 的你有幫助和啟發!另外,若你對這篇的內容有任何疑問,或是對我在未來的文章能提供的題材有任何的建議,都歡迎你在 Medium 的留言區告訴我,謝謝!


在接下來的文章裡,我會繼續和大家分享 Python 與 Excel 還有哪一些好用的整合方案以及應用場景,敬請期待!

小結

在這篇文章裡我們見識到 openpyxl 套件有個限制,就是無法寫入資料到一個正在被其他應用程式開啟的 Excel 檔。而我們也認識了 xlwings 這個強大的套件,它不但沒有上述 openpyxl 的限制,同時在函數的界面上非常接近 VBA,一方面不會對 Python 的開發者帶來負擔,另一方面大幅降低VBA 開發者切換至 Python 語言的成本,可説是個真正有在用心做的套件。


當然,xlwings 也有它的侷限:那就是它需要 Excel 應用程式才能運作,不過由於 Excel 的普及,這個相對是個小問題,若你的電腦沒有安裝 Excel,建議你買個正版的 Office 來使用,想想 Excel 能為你帶來的便利以及節省的時間,絕對是一個值得的投資。

YOTTA 你最專業的學習夥伴,提供優質內容與有趣觀點,擴大豐富你的視野。





封面圖片來源:needpix