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