python的一大優(yōu)勢是生態(tài)豐富,各種想要的庫都有人做好了,省掉造輪子的成本。對于Excel文件操作,也不例外。在Python中操作Excel有2條思路。
- 使用
pywin32 ,內含win32com 等多個包,使用微軟獨門的COM 接口技術去操控系統(tǒng)中的Excel軟件。沿著這條思路,好處是除了Excel軟件,可以操控系統(tǒng)中任意支持COM 接口的軟件,微軟全家桶是必然在列滴,其他就難說了;劣勢就是COM 接口技術比較老舊了,僅在Windows平臺中使用,而且系統(tǒng)中必須已經安裝好Excel軟件。
- 使用讀寫表格文件的庫,如
xlrd/xlwt/xlutils 、openpyxl 、pyexcel 、XlsxWriter 等,這些庫封裝了對Excel文件的讀寫操作的函數(shù)。
在Python中操作Excel文件
本文對第2條思路中常見的庫進行簡單評述與總結。
0x00 xlrd/xlwt/xlutils簡介這3個必須捆綁到一起說。Simplistix公司開發(fā)了這3個庫,還提供了一個教程Working with Excel files in Python,教程是2009年出的,原網站內容基本都清空了,項目遷移到http://www.,教程遷移到https://github.com/python-excel/tutorial。
xlrd 用于讀取Excel文件表格中的數(shù)據(jù),rd 含義就是read,同時支持xls和xlsx兩種格式標準;
xlwt 用于將數(shù)據(jù)寫入Excel文件,wt 含義就是write,僅支持xls格式標準;
xlutils 依賴于xlrd 和xlwt ,提供讀寫相關支持的工具集,比如類型轉換、workbook復制等。
吐槽一句,這3個東西原本應該做到一起的,搞成3個麻煩。
xls和xlsx格式注意文件后綴名跟格式標準沒關系,不是說文件擴展名用xlsx就一定是xlsx格式、用xls就一定是xls格式,而是兩種格式標準文件在數(shù)據(jù)組織方式、數(shù)據(jù)量支持等多方面就存在本質差異。微軟自Office 2007系列之后開始廣泛支持xlsx格式標準,使用xls格式標準的文件逐漸減少。 xls是微軟私有的文件格式標準,以二進制方式直接保存文件,最大支持行數(shù)65536行、列數(shù)256列,而xlsx是基于Office Open XML標準的格式,實質是以zip壓縮包保存文件,只是擴展名使用了xlsx,可以用解壓軟件查看壓縮包內容,最大支持1048576行、16384列。
主要特性xlrd/xlwt 是以非常原始的方式進行Excel表格數(shù)據(jù)讀寫,可以類比為CPU編程的匯編語言、Web開發(fā)中的JavaScript,好處嘛就是運行速度相對快,缺點就是代碼要寫得比較啰嗦。xlrd/xlwt 實現(xiàn)了Book(工作簿)、Sheet(表單)、Cell(單元格)多級對象,并將單元格分為文本(Text)、數(shù)字(Number)、日期(Date)、布爾(Boolean)、錯誤(Error)、空白(Empty/Blank)幾種類型。比較蛋疼的是,xlrd 中的Book和xlwt 中Book并非是同一類型,在Book對象中獲取Sheet對象的方法也不同,正因為如此,才需要xlutils 做中間橋梁進行轉換。
xlrd/xlwt 對Excel文件支持較好,除了常規(guī)數(shù)據(jù)讀寫,還支持單元格字體、邊框線風格,還支持寫入表格公式,但實際使用表明大量公式不支持,讀入表格只能得到公式值,另外不支持圖表繪制。
在數(shù)據(jù)訪問方面,xlrd/xlwt 可以整行/列操作,單元格索引則完全依賴行列序號,但提供了函數(shù)用于行列序號與Excel風格單元格地址相互轉換。
xlrd/xlwt/xlutils 對外暴露的類型、方法、函數(shù)中規(guī)中矩,也沒有什么花式操作,用戶只了解最常用的小部分也能完成工作。
0x01 openpyxl簡介openpyxl 是由一群志愿者在業(yè)余時間開發(fā)維護的開源項目,用于在Python中原生地讀寫Excel xlsx/xlsm/xltx/xltm格式文件,項目地址 http:///openpyxl/openpyxl。openpyxl 對Excel文件功能支持十分完備:除了常規(guī)數(shù)據(jù)讀寫,還支持單元格合并/分拆、插入圖片、(有限的)圖表繪制、公式寫入/解析、單元格注釋、只讀/只寫模式、單元格字體/對齊/填充/邊框線風格、條件格式、數(shù)據(jù)有效性等。
主要特性在數(shù)據(jù)訪問方面,openpyxl 支持整行/列操作,單元格索引既可以用行列序號,也可以用Excel風格單元格地址,內部自動轉換無需用戶操心。
Excel功能支持方面,openpyxl 堪稱完美,但最大痛點是不支持xls格式,而目前實際仍有不少xls格式文件在應用中。
0x02 XlsxWriter簡介XlsxWriter 是用于創(chuàng)建Excel xlsx格式文件的包,僅支持寫操作,不支持xls格式,非常適合于生成新表格文件的應用場合,對于讀出表格數(shù)據(jù)進行分析則無能為力。XlsxWriter 開源,項目地址為 https://github.com/jmcnamara/XlsxWriter。
在Excel功能支持方面十分完備,XlsxWriter 支持單元格合并/分拆、圖片插入、圖表繪制、公式、單元格注釋、單元格數(shù)字格式/字體/對齊/填充/邊框線風格、條件格式、數(shù)據(jù)有效性、文本框插入、VBA等,還能與pandas 集成進行數(shù)據(jù)分析,運行效率也很高。
主要特性XlsxWriter 在寫入數(shù)據(jù)方面設計很有特點,對外只暴露1個write方法,內部則根據(jù)要寫入的數(shù)據(jù)格式(Excel單元格所規(guī)定的數(shù)字、字符串、公式、空白、日期時間、鏈接等),回調相應的handler,同時允許用戶添加自定義handler,在匹配自定義數(shù)據(jù)格式時自動回調。這樣設計僅需掌握1個write方法便可搞定所有的寫操作,簡潔明了,保持靈活性同時不失統(tǒng)一性。
在數(shù)據(jù)訪問方面,XlsxWriter 支持整行/列操作,單元格索引既可以用行列序號,也可以用Excel風格單元格地址,內部自動轉換無需用戶操心。
XlsxWriter 對外暴露的類型、方法、函數(shù)相對較為簡潔,數(shù)量也不多,風格也很統(tǒng)一,用戶上手十分容易,提供的文檔和樣例十分豐富。
0x03 pyexcel簡介與上述幾個庫所不同的是,pyexcel 是一個包裝庫,底層依賴實際是xlrd/xlwt 、openpyxl 、XlsxWriter 、lxml 等,經過封裝后對外提供一套API進行Excel文件讀寫,可類比為CPU編程的C語言、Web開發(fā)中的jQuery等,好處就是簡化了代碼編寫過程,缺點就是運行效率降低了。pyexcel 開源,項目地址為https://github.com/pyexcel/pyexcel。
除了支持Excel的xls、xlsx格式,還支持csv、tsv文本格式,以及sql數(shù)據(jù)庫表、Python內置的dict/嵌套list數(shù)據(jù)類型等,讓用戶專注于處理表格數(shù)據(jù),不必操心數(shù)據(jù)存儲介質的細節(jié),另外對字體/顏色/邊框風格、圖表繪制、公式等均不支持。
主要特性pyexcel 被設計為插件式,模塊化地支持各種功能,默認安裝只有pyexcel 、pyexcel-io 兩個包,僅支持csv、tsv文本格式,對Excel表格支持就是通過各種插件完成的,用戶完全根據(jù)自己所需只安裝必要的插件而不影響整體功能。
- 對xls的格式讀寫支持由
pyexcel-xls 插件完成,依賴于xlrd/xlwt ;
- 對xlsx的格式讀寫支持由
pyexcel-xlsx 插件完成,依賴于openpyxl ;
- 只寫xlsx的支持由
pyexcel-xlsxw 插件完成,依賴于XlsxWriter ;
- 只讀xlsx的支持由
pyexcel-xlsxr 插件完成,依賴于lxml ;
- 對ods(Open Document Spreadsheet,開放文檔表單,在Open Office等開源辦公軟件中使用廣泛)格式的讀寫支持由
pyexcel-ods 插件完成,依賴于odfpy ;
- 其他更多格式支持詳情,參考庫文檔。
在數(shù)據(jù)訪問方面,pyexcel 支持整個表單、整行/列、矩形區(qū)操作,單元格索引既可以用行列序號,也可以用Excel風格單元格地址,內部自動轉換無需用戶操心。
pyexcel 對外暴露的類型、方法、函數(shù)種類繁多,參數(shù)繁多,功能多樣,用戶可能只需要了解其中少部分就能完成工作。
0x04 小結對以上幾個庫的主要特性和不足總結對此如下。
Python中操作Excel的幾種常見庫對比
上述幾個庫對數(shù)據(jù)分析即使有支持也十分有限,主要用來讀出/寫入文件,中間的數(shù)據(jù)分析過程嘛,則可以交給其他庫來完成,充分發(fā)揮Python生態(tài)極度豐富的優(yōu)勢,如numpy 、pandas 等。
若是要處理的表格文件較少,最快捷的方式仍然是各種辦公軟件,微軟的Office、金山的WPS、開源的Open Office / Libre Office等。遇到大量重復性的表格文件,才有必要通過程序自動化。面對這么多Excel表格文件操作庫,該如何選擇?如果要格式和功能的廣泛支持,首選xlrd/xlwt/xlutils 或pyexcel ;如果沒有兼容xls格式的包袱,首選openpyxl ;如果只需要在應用中導出/生成表格,則首選XlsxWriter 。
參考
|