Excel 神器 —— OpenPyXl

Excel 神器 —— OpenPyXl

原文轉(zhuǎn)自:濤哥聊Python

以下文章來源于Python技術(shù) ,作者派森醬

Python技術(shù)

Python技術(shù)

image

無論是日常辦公還是編程摄悯,總是離不開 Excel赞季,用來導入導出數(shù)據(jù),記錄數(shù)據(jù)奢驯,統(tǒng)計分析申钩,畫原型,甚至在日本有位老爺爺用 Excel 來創(chuàng)作繪畫

雖然 Excel 功能強大瘪阁,操作便利撒遣,但是有些場景下還是不太方便,例如 將大量數(shù)據(jù)導入到 Excel管跺,將 Excel 中的數(shù)據(jù)讀取到系統(tǒng)中义黎,或者按照某種結(jié)構(gòu)格式化下原有數(shù)據(jù),批量處理大量 Excel 文檔等豁跑,幸運的是廉涕,有很多 Python 庫可以幫助我們用程序來控制 Excel,完成難以手工完成的任務艇拍,現(xiàn)在就來了解下吧

Python 下的 Excel 庫

Python 中有大量的原生和第三方 Excel 操作包狐蜕,各有所長,不過對于剛使用 Python 與 Excel 交互的同學來說卸夕,可能有點目不暇接馏鹤,所以先簡單梳理一下常見的一些 Excel 包

  • OpenPyXL 是個讀寫 Excel 2010 xlsx/xlsm/xltx/xltm 的 Python 庫,簡單易用娇哆,功能廣泛湃累,單元格格式/圖片/表格/公式/篩選/批注/文件保護等等功能應有盡有,圖表功能是其一大亮點
  • xlwings 是一個基于 BSD 授權(quán)協(xié)議的 Python 庫碍讨,可以輕松的使用 Python 操作 Excel治力,也可以在 Excel 中調(diào)用 Python,以接近 VBA 語法的實現(xiàn) Excel 編程勃黍,支持 Excel 宏宵统,并且可以作為 Web 服務器,提供 REST API 接口
  • pandas 數(shù)據(jù)處理是 pandas 的立身之本,Excel 作為 pandas 輸入/輸出數(shù)據(jù)的容器
  • win32com 從命名上就可以看出马澈,這是一個處理 windows 應用的擴展瓢省,Excel 只是該庫能實現(xiàn)的一小部分功能。該庫還支持 office 的眾多操作痊班。需要注意的是勤婚,該庫不單獨存在,可通過安裝 pypiwin32 或者 pywin32 獲取
  • Xlsxwriter 擁有豐富的特性涤伐,支持圖片/表格/圖表/篩選/格式/公式等馒胆,功能與 openpyxl 相似,優(yōu)點是相比 openpyxl 還支持 VBA 文件導入凝果,迷你圖等功能祝迂,缺點是不能打開/修改已有文件,意味著使用 xlsxwriter 需要從零開始
  • DataNitro 一個 Excel 的付費插件器净,內(nèi)嵌到 Excel 中型雳,可完全替代 VBA,在 Excel 中使用 python 腳本山害。既然被稱為 Excel 中的 python纠俭,同時可以與其他 python 庫協(xié)同。
  • xlutils 基于 xlrd/xlwt粗恢,老牌 python 包柑晒,算是該領(lǐng)域的先驅(qū),功能特點中規(guī)中矩眷射,比較大的缺點是僅支持 xls 文件匙赞。

概括一下:

  • 不想使用 GUI 而又希望賦予 Excel 更多的功能,openpyxl 與 xlsxwriter妖碉,二者可選其一涌庭;
  • 需要進行科學計算,處理大量數(shù)據(jù)欧宜,建議 pandas+xlsxwriter 或者 pandas + openpyxl坐榆,是不錯的選擇;
  • 想要寫 Excel 腳本冗茸,會 Python 但不會 VBA席镀,可考慮 xlwings 或 DataNitro;
  • win32com 功能還是性能都很強大夏漱,不過需要一定的 windows 編程經(jīng)驗才能上手豪诲,它相當于是 windows COM 的封裝,另外文檔不夠完善

OpenPyXL

OpenPyXl 幾乎可以實現(xiàn)所有的 Excel 功能挂绰,而且接口清晰屎篱,文檔豐富,學習成本相對較低,今天就以 OpenPyXL 為例交播,了解下如何操作 Excel

安裝

用 pip 安裝

pip install openpyxl

安裝成功后重虑,可以跑通下面測試:

python -c "import openpyxl"

基本概念

  • workbook 相當于一個 Excel 文件檔,每個被創(chuàng)建和打開的 Excel 文件都是獨立的 Workbook 對象
  • sheet Excel 文檔中的表單秦士,每個 Excel 文檔至少需要一個 sheet
  • cell 單元格缺厉,是不可分割的基本數(shù)據(jù)存儲單元

小試牛刀

先來看跑個測試

from openpyxl import Workbook

需要注意的是:

  • 新創(chuàng)建的 workbook 對象,會自帶一個名為 Sheet 的表單伍宦,Office Excel 新建會創(chuàng)建 3 個
  • 創(chuàng)建的 workbook 會將第一個 表單 激活芽死,通過 wb.active 獲取引用
  • python-docx work 庫一樣乏梁,save 方法會立即保存次洼,不會有任何提示,建議選擇不同文件名來保存

常用功能

OpenPyXl 功能很多遇骑,從單元格處理到圖表展示卖毁,涵蓋了幾乎全部的 Excel 功能,這里就一些常用的功能做展示落萎,更多的用法可以參考 OpenPyXl 文檔(文末參考里有鏈接)

創(chuàng)建和打開 Excel

小試牛刀部分看到了如何創(chuàng)建一個 Excel

如果要加載一個已存在的 Excel 文件亥啦,需要用 load_workbook 方法,給定文件路徑练链,返回 workbook 對象:

from openpyxl import load_workbook

load_workbook 除了參數(shù) filename外為還有一些有用的參數(shù):

  • read_only:是否為只讀模式翔脱,對于超大型文件,要提升效率有幫助
  • keep_vba :是否保留 vba 代碼媒鼓,即打開 Excel 文件時届吁,開啟并保留宏
  • guess_types:是否做在讀取單元格數(shù)據(jù)類型時,做類型判斷
  • data_only:是否將公式轉(zhuǎn)換為結(jié)果绿鸣,即包含公式的單元格疚沐,是否顯示最近的計算結(jié)果
  • keep_links:是否保留外部鏈接

操作 sheet

from openpyxl import Workbook
  • 每個 Workbook 中都有一個被激活的 sheet,一般都是第一個潮模,可以通過 active 直接獲取
  • 可以通過 sheet 名來獲取 sheet 對象
  • 創(chuàng)建 sheet時需要提供 sheet 名稱參數(shù)亮蛔,如果該名稱的 sheet 已經(jīng)存在,則會在名稱后添加 1擎厢,再有重復添加 2究流,以此類推
  • 獲得 sheet 對象后,可以設(shè)置 名稱(title)动遭,背景色等屬性
  • 同一個 Workbook 對象中芬探,可以復制 sheet,需要將源 sheet 對象作為參數(shù)沽损,復制的新 sheet 會在最末尾
  • 可以刪除一個 sheet灯节,參數(shù)是目標 sheet 對象

操作單元格

單元格(cell)是 Excel 中存放數(shù)據(jù)的最小單元,就是圖形界面中的一個個小格子

OpenPyXl 可以操作單個單元格,也可以批量操作單元格

單獨操作

單獨操作炎疆,即通過 Excel 單元格名稱或者行列坐標獲取單元格卡骂,進行操作

ws1 = wb.create_sheet("Mysheet")  #創(chuàng)建一個sheet
  • 可以通過單元格名稱設(shè)置,類似于 sheet 的某種屬性
  • 也可以通過行列坐標類設(shè)置

批量操作

需要一下子操作多個單元格時形入,可以用批量操作來提高效率

  • 指定行列
# 操作單列
  • 所有行或者列
# 所有行
  • 設(shè)置整行數(shù)據(jù)
ws.append((1,2,3))

合并單元格

# 合并
  • sheet 對象的 merge_cells 方法是合并單元格全跨,unmerge_cells 是解除合并
  • 分別有兩種參數(shù)形式,一種是用單元格名稱方式指定亿遂,另一種是通過命名參數(shù)指定
  • 注意:對于沒有合并過單元格的位置調(diào)用 unmerge_cells 時會報錯

單元格格式

OpenPyXl 用6種類來設(shè)置單元格的樣式

  • NumberFormat 數(shù)字
  • Alignment 對齊
  • Font 字體
  • Border 邊框
  • PatternFill 填充
  • Protection 保護
from openpyxl.styles import Font, PatternFill, Border, Side, Alignment, Protection
  • 引入字體類
  • 用 cell 方法浓若,為單元格設(shè)置值的同時,設(shè)置格式
  • 每種格式都有特定的屬性蛇数,為其設(shè)置特定的格式對象
  • 數(shù)字格式有點區(qū)別挪钓,通過設(shè)置格式名稱來完成,numbers.FORMAT_PERCENTAGE 是個字符串
  • Border 類耳舅,需要配合 Side 類使用碌上,它們都在 openpyxl.styles 中定義
  • 需要注意的是,單元格樣式屬性只能通過樣式對象賦予浦徊,而無法通過樣式屬性來修改馏予,例如 ws.cell(1, 1).font.color = '00FF00' 會報錯,如果真要換盔性,需要重新創(chuàng)建一個樣式實體霞丧,重新賦值

上面展示的是單個單元格格式的設(shè)置,也可以批量設(shè)置冕香,有兩種方式蛹尝,一種是循環(huán)范圍內(nèi)的所有單元格,逐個設(shè)置暂筝,另一種是對整列或者整行設(shè)置:

font = Font(bold=True)

更多樣式類的定義和參數(shù)箩言,可參 OpenPyXl 文檔

圖表

圖表是 Excel 中很重要的部分,作為數(shù)據(jù)可視化的高效工具焕襟,利用 OpenPyXl 可以用編程的方式陨收,在 Excel 中制作圖表,創(chuàng)建過程和直接在 Excel 中差不多鸵赖,下面以柱狀圖和圓餅圖為例做演示

柱狀圖

from openpyxl import Workbook
  • 引入柱狀圖類 BarChart 和 數(shù)據(jù)應用類 Reference
  • 創(chuàng)建 Workbook务漩,并為活動 Sheet 添加數(shù)據(jù)
  • 創(chuàng)建柱狀圖對象,設(shè)置圖表屬性它褪,type 為 col 為列狀圖饵骨,bar 為水平圖
  • 創(chuàng)建數(shù)據(jù)引用對象,指定從那個 sheet 以及數(shù)據(jù)范圍
  • 創(chuàng)建系列數(shù)據(jù)引用對象
  • 將數(shù)據(jù)和系列加入到圖表對象中
  • 最后將圖表對象用 add_chart 添加到 sheet 里
image

圓餅圖

from openpyxl import Workbook
  • 引入餅圖類 PieChart 和 數(shù)據(jù)應用類 Reference
  • 創(chuàng)建圖表數(shù)據(jù)
  • 創(chuàng)建圖表對象茫打,設(shè)置圖表標題
  • 定義標簽數(shù)據(jù)引用和數(shù)據(jù)引用居触,并將其加入到圖表
  • 將圖表對象添加到 sheet 的指定位置
image

總結(jié)

今天以 OpenPyXl 庫為例妖混,了解了 Python 操作 Excel 的基本方法,限于篇幅轮洋,無法全面的清晰的介紹更多功能制市,期望通過這篇短文,激發(fā)起您多程序化操作 Excel 的興趣弊予,讓讓工作祥楣、學習更高效,就如那句名言一樣:“ 人生苦短汉柒,我用 Python”

參考

OpenPyXl 文檔 https://openpyxl.readthedocs.io
Excel 作畫 https://zhuanlan.zhihu.com/p/34917620
http://www.reibang.com/p/be1ed0c5218e
https://www.douban.com/note/706513912/
https://blog.csdn.net/weixin_41595432/article/details/79349995

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末误褪,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子碾褂,更是在濱河造成了極大的恐慌兽间,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斋扰,死亡現(xiàn)場離奇詭異渡八,居然都是意外死亡啃洋,警方通過查閱死者的電腦和手機传货,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宏娄,“玉大人问裕,你說我怎么就攤上這事》跫幔” “怎么了粮宛?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卖宠。 經(jīng)常有香客問我巍杈,道長,這世上最難降的妖魔是什么扛伍? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任筷畦,我火速辦了婚禮,結(jié)果婚禮上刺洒,老公的妹妹穿的比我還像新娘鳖宾。我一直安慰自己,他們只是感情好逆航,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布鼎文。 她就那樣靜靜地躺著,像睡著了一般因俐。 火紅的嫁衣襯著肌膚如雪拇惋。 梳的紋絲不亂的頭發(fā)上周偎,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音撑帖,去河邊找鬼栏饮。 笑死,一個胖子當著我的面吹牛磷仰,可吹牛的內(nèi)容都是我干的袍嬉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼灶平,長吁一口氣:“原來是場噩夢啊……” “哼伺通!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逢享,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤罐监,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瞒爬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弓柱,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年侧但,在試婚紗的時候發(fā)現(xiàn)自己被綠了矢空。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡禀横,死狀恐怖屁药,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柏锄,我是刑警寧澤酿箭,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站趾娃,受9級特大地震影響缭嫡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抬闷,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一妇蛀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饶氏,春花似錦讥耗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至喊崖,卻和暖如春挣磨,著一層夾襖步出監(jiān)牢的瞬間雇逞,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工茁裙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留塘砸,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓晤锥,卻偏偏與公主長得像掉蔬,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矾瘾,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348