一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

用Python讀寫Excel文件總結(jié)

 心不留意外塵 2016-04-29

http://blog.csdn.net/jazywoo123/article/details/18356011

2014.01 

雖然天天跟數(shù)據(jù)打交道,也頻繁地使用Excel進(jìn)行一些簡單的數(shù)據(jù)處理和展示,但長期以來總是小心地避免用Python直接讀寫Excel文件。通常我都是把數(shù)據(jù)保存為以TAB分割的文本文件(TSV),再在Excel中進(jìn)行導(dǎo)入或者直接復(fù)制粘貼。

前段時間做一個項目,卻不得不使用Python直接生成Excel文件,后來隨著需求的變化,還要對已有的Excel文件進(jìn)行讀取。在這個過程中,研究并嘗試了一些工具,也走了一些彎路。記錄下來,下次再有類似需求的時候就不用漫天遍野地搜索了。

超級無敵大PK

我主要嘗試了四種工具,在此并不會給出他們的排名,因為在不同的應(yīng)用場景下,做出的選擇會不同。

  XlsxWriter xlrd&xlwt OpenPyXL Microsoft Excel API
介紹 可以創(chuàng)建Excel 2007或更高版本的XLSX文件 python-excel,含xlrd、xlwtxlutils三大模塊,分別提供讀、寫和其他功能 可以讀寫Excel 2007 XLSX和XLSM文件 直接通過COM組件與Microsoft Excel進(jìn)程通信調(diào)用其各種功能實現(xiàn)對Excel文件的操作
修改
.xls
.xlsx
大文件
功能 強(qiáng) 一般 超強(qiáng)
速度 超慢
系統(tǒng) 無限制 無限制 無限制 Windows + Excel
適用場景
  • 要創(chuàng)建XLSX文件
  • 不需要讀取已有文件
  • 需要實現(xiàn)比較復(fù)雜的功能
  • 數(shù)據(jù)量可能會很大
  • 需要跨平臺
  • 要讀取XLS或XLSX文件
  • 要生成XLS文件
  • 需要的功能不太復(fù)雜
  • 需要跨平臺
  • 要處理XLSX文件
  • 需要修改已有文件,或者在寫入過程中需要不斷修改
  • 需要的功能比較復(fù)雜
  • 數(shù)據(jù)量可能會很大
  • 需要跨平臺
  • 需要處理各種文件格式
  • 需要用到特別復(fù)雜的功能
  • 在修改文件時,不希望對原有信息造成任何意外破壞
  • 數(shù)據(jù)量很小,或者愿意等待
  • 僅在Windows中使用

XlsxWriter

XlsxWriter是我最終選擇的用于寫操作的工具。顧名思義,它只能用來寫文件。

這應(yīng)該是個比較新的項目,在GitHub上看它最早的提交是在2013年1月份。其官方文檔中宣稱它支持:

  • 100% compatible Excel XLSX files.
  • Full formatting.
  • Merged cells.
  • Defined names.
  • Charts.
  • Autofilters.
  • Data validation and drop down lists.
  • Conditional formatting.
  • Worksheet PNG/JPEG images.
  • Rich multi-format strings.
  • Cell comments.
  • Memory optimisation mode for writing large files.

優(yōu)點

一、功能比較強(qiáng)

相對而言,這是除Excel自身之外功能最強(qiáng)的工具了。比如我就用到了它提供的:字體設(shè)置、前景色背景色、border設(shè)置、視圖縮放(zoom)、單元格合并、autofilter、freeze panes、公式、data validation、單元格注釋、行高和列寬設(shè)置等等。

最讓我驚奇的是,用它生成的帶有單元格注釋的Excel文件,不論是Excel 2007還是Excel 2013都可正常打開(下面會提到,這個任務(wù)用Excel自身都無法完成)。

二、支持大文件寫入

如果數(shù)據(jù)量非常大,可以啟用constant memory模式,這是一種順序?qū)懭肽J剑玫揭恍袛?shù)據(jù)就立刻寫入一行,而不會把所有的數(shù)據(jù)都保持在內(nèi)存中。

缺點

一、不支持讀取和修改

作者并沒有打算做一個XlsxReader來提供讀取操作。不能讀取,也就無從修改了。它只能用來創(chuàng)建新的文件。我是利用xlrd把需要的信息讀入后,用XlsxWriter創(chuàng)建全新的文件。

另外,即使是創(chuàng)建到一半Excel文件,也是無法讀取已經(jīng)創(chuàng)建出來的內(nèi)容的(信息應(yīng)該在,但是并沒有相應(yīng)的接口)。因為它的主要方法是write而不是set。當(dāng)你在某個單元格寫入數(shù)據(jù)后,除非你自己保存了相關(guān)的內(nèi)容,否則還是沒有辦法讀出已經(jīng)寫入的信息。從這個角度看,你無法做到讀出->修改->寫回,只能是寫入->寫入->寫入。

二、不支持XLS文件

XLS是Office 2013或更早版本所使用的格式,是一種二進(jìn)制格式的文件。XLSX則是用一系列XML文件組成的(最后的X代表了XML)一個壓縮包。如果非要創(chuàng)建低版本的XLS文件,就請移步xlwt吧。

三、暫時不支持透視表(Pivot Table)

透視表是非常麻煩的東西,除了自身復(fù)雜的結(jié)構(gòu)外,還需要一套數(shù)據(jù)緩存。我向作者提出了這個需求,不過這是個很難完全實現(xiàn)的功能,我們慢慢期待吧。

xlrd&xlwt

我的程序在第一版的時候,使用xlwt創(chuàng)建XLS文件,然后通過Microsoft Excel API將其轉(zhuǎn)換為XLSX文件,并寫入高級的Data Validation(Excel 2007的Data Validation比Excel 2003要強(qiáng)大不少)和單元格注釋。

我的程序最終的版本也依然用xlrd從已有的文件中讀出所需的信息。

xlrd&xlwt主要是針對Office 2013或更早版本的XLS文件格式。

優(yōu)點

一、支持XLS格式

XlsxWriter和OpenPyXL都不支持XLS格式,從這個角度看,xlrd&xlwt仍然有一定的不可替代性。

缺點

一、對XLSX支持比較差

目前xlrd已經(jīng)可以讀取XLSX文件了,有限地支持。至于xlwt我沒有試驗過,估計是夠嗆。

二、對修改的支持比較差

xlrd和xlwt是兩個相對獨(dú)立的模塊,雖然xlutils提供方法幫助你把xlrd.Book對象復(fù)制到xlwt.Workbook對象,但跟XlsxWriter類似,后者只是提供write方法,使得你無法很容易地獲取當(dāng)前已經(jīng)寫入的數(shù)據(jù)并進(jìn)行有針對性的修改。如果非要這樣做,你要不斷地保存,然后再用新的xlrd.Book對象讀取你要的信息,還是比較麻煩的。

三、功能很弱

除了最基本的寫入數(shù)據(jù)和公式,xlwt所提供的功能非常少(Excel 2013本身支持的功能也就很少)。對于讀取也是一樣的,很多信息在讀入時就丟失掉了。

OpenPyXL

OpenPyXL是比較綜合的一個工具,能讀能寫能修改,功能還算可以但也有很大的缺陷。我在中間版本的時候是打算完全依賴它的,但后來發(fā)現(xiàn)一個嚴(yán)重的問題就放棄了。

優(yōu)點

一、能讀能寫能修改

OpenPyXL的工作模式跟XlsxWriter和xlwt有很大的區(qū)別,它用的是getter/setter模式。你可以隨時讀取某個單元格的內(nèi)容,并根據(jù)其內(nèi)容進(jìn)行相應(yīng)的修改,OpenPyXL會幫你記住每個單元格的狀態(tài)。

特別需要注意的一點:雖然它支持修改已有文件,但由于其所支持的功能有限,讀入文件時會忽略掉它所不支持的內(nèi)容,再寫入時,這些內(nèi)容就丟失了。因此使用時一定要慎重。比如下面的缺點中提到它無法讀入公式,那如果你修改一個帶有公式的文件,保存之后,所有的公式就都沒有了。

二、功能還算可以

整體來講,它所支持的功能介于XlsxWriter和xlwt之間。

缺點

一、不支持XLS

這件事情只能讓xlrd和xlwt去做。

二、不支持讀取公式

這其實是個不太簡單的事情,雖然我沒嘗試過,但相信xlrd也做不好這件事。

Excel的單元格如果是一個公式,它內(nèi)部會同時保存公式本身和運(yùn)算結(jié)果的緩存。用OpenPyXL讀取單元格內(nèi)容,它不會告訴你這個單元格的公式是什么,甚至不會告訴你這個單元格存的是公式,它只會拿到這個緩存的運(yùn)算結(jié)果。我本來想利用它判別單元格是不是用了公式,然后做出不同的處理。結(jié)果遇到了這個問題,最后只好采取了其他變通的方式去做。

Microsoft Excel API

大部分Windows環(huán)境的開發(fā)人員都會選擇Microsoft Excel API。實際上不僅僅是Python,幾乎各種語言都有相應(yīng)的方法使用它,因為核心的邏輯完全是由Microsft Excel自身提供的。語言相關(guān)的部分只是負(fù)責(zé)跟Windows的COM組件進(jìn)行通信。

在Python中首先需要安裝Python for Windows extensionspywin32),具體的文檔可以查閱Win32 ModulesPython COM。

當(dāng)然你還必須要安裝某一個版本的Microsoft Office Excel,它內(nèi)部的DLL負(fù)責(zé)實際的操作。

優(yōu)點

一、最大的優(yōu)點:強(qiáng)大無極限

因為直接與Excel進(jìn)程通信,你可以做任何在Excel里可以做的事情。

二、文檔豐富

MSDN上的文檔絕對是世界上最優(yōu)秀的文檔。沒有之一。

三、調(diào)試方便

你完全可以直接在Excel里面用宏先調(diào)試你想要的效果。甚至如果你不清楚怎么用程序?qū)崿F(xiàn)某個操作,你可以通過宏錄制的方法得到該操作的處理代碼。

缺點

一、致命的缺點:慢到死

因為需要與Excel進(jìn)程通信,其效率是非常低的。

如果讓Excel窗口可見,隨著程序的運(yùn)行,你可以看到每一句程序所帶來的變化,單元格的內(nèi)容一個一個地改變。如果要寫入的數(shù)據(jù)很多,那速度是無法忍受的。

二、平臺限制

目前還沒有發(fā)現(xiàn)可以在非Windows系統(tǒng)使用它的方法。

另外,基于它的程序能做什么事情,很大程度上依賴于當(dāng)前系統(tǒng)所安裝的Excel版本。不同的版本在功能上有很大的差異,API也會有差異。用起來會比較麻煩。

三、Excel自身bug導(dǎo)致的問題

我剛好發(fā)現(xiàn)了其中一個,這和Python沒有任何關(guān)系,可以完全在Excel中手動復(fù)現(xiàn)。在Excel 2007中隨便創(chuàng)建一個文件,給某個單元格添加注釋,保存。換臺電腦,用Excel 2013打開,就會報錯,然后注釋就消失了。

同樣如果你的程序在一臺裝有Excel 2007的機(jī)器上創(chuàng)建一個帶有注釋的Excel文件,把這個文件拿到Excel 2013中打開也會報錯,也看不到注釋。反過來也一樣。

關(guān)于初始化

Excel的com接口的具體細(xì)節(jié)我就不介紹了,需要的話直接查閱相關(guān)的MSDN文檔即可。這里只提幾個特殊的小問題。

要想得到一個可以操作的excel對象,一般可以有兩種方式:

import win32com.client

excel = win32com.client.Dispatch('Excel.Application')
import win32com.client

excel = win32com.client.DispatchEx('Excel.Application')

二者的區(qū)別在于,Dispatch方法會試圖尋找并復(fù)用一個已有的Excel進(jìn)程(比如你已經(jīng)在運(yùn)行著的Excel程序),而DispatchEx則一定會創(chuàng)建一個新的Excel進(jìn)程。一般情況使用前者就可以了,還能節(jié)省一些資源的開銷。但也會帶來一些麻煩,有一些狀態(tài)是在一個Excel進(jìn)程內(nèi)共享的,你在同進(jìn)程的其他窗口內(nèi)操作有可能會影響到Python程序所要進(jìn)行的處理,導(dǎo)致各種錯誤。比如當(dāng)你手動開啟的Excel窗口中,某個單元格正處于編輯狀態(tài),那Python程序控制的大部分操作都有可能失?。词顾僮鞯氖橇硪粋€文件),因為一個Excel進(jìn)程中無法讓兩個單元格同時被編輯。

為了避免麻煩,我一般都使用DispatchEx方法。

關(guān)于窗口可見

可以讓新啟動的Excel進(jìn)程窗口可見,就像你通過雙擊桌面上的圖標(biāo)啟動一樣,程序所控制的每一步操作,在這個窗口中都可以觀察得到。你也可以同時進(jìn)行手動的操作,但一旦這樣做,很有可能使你的Python程序崩潰。

窗口不可見也會帶來一些麻煩,前面說了,通過Python啟動的Excel進(jìn)程跟你直接從桌面打開的Excel進(jìn)程沒有什么區(qū)別,在使用Excel的過程中,我們經(jīng)常會遇到各種彈出的錯誤、警告或者提示框,這些在用Python處理時也有可能遇到。尤其當(dāng)你的程序還沒完全調(diào)試好時。

我一般都會讓程序控制的Excel進(jìn)程在調(diào)試過程中可見,正式使用時不可見,通過類似這樣的命令(假設(shè)你有一個叫做is_debug的變量記錄當(dāng)前是否在調(diào)試狀態(tài)):

excel = win32com.client.DispatchEx('Excel.Application')
if is_debug:
    excel.Visible = True

關(guān)于保存并覆蓋已有文件

打開和保存文件的細(xì)節(jié)不在這里多說了,可以查看MSDN中相關(guān)的API介紹,非常詳細(xì)。這里只說一下在另存為時,如果目標(biāo)文件已經(jīng)存在怎么辦。Excel的API另存為方法似乎并沒有提供參數(shù)決定是否直接覆蓋同名的目標(biāo)文件,在窗口操作中,這種情況會彈出一個確認(rèn)框來讓用戶決定。我們的程序當(dāng)然不想這么做,實際上如果你按照上面所說的讓窗口不可見,你也就看不到彈出的窗口。

可以把DisplayAlert屬性關(guān)閉,這樣Excel就不會彈出確認(rèn)窗,而是直接覆蓋同名文件。

orig_display_alerts = excel.DisplayAlerts
excel.DisplayAlerts = False
try:
    book.SaveAs(save_as_file_path)
finally:
    excel.DisplayAlerts = orig_display_alerts

關(guān)于結(jié)束Excel進(jìn)程

進(jìn)程是一種資源,我們申請了資源,在用完之后就必須要釋放掉。尤其如果你隱藏了Excel窗口,用戶只有查看系統(tǒng)進(jìn)程,否則無法關(guān)閉你所開啟的進(jìn)程。

但是一個Excel進(jìn)程是可以同時開啟多個文件的,這些文件可能是你程序的其他部分開啟的,也可能是用戶自己開啟的。這樣你就不能隨意地結(jié)束Excel進(jìn)程,否則會影響到其他人或程序的操作。

我一般會在我的處理完成后(關(guān)閉了我自己打開或者創(chuàng)建的Excel文件),判斷一下當(dāng)前Excel進(jìn)程是否還開啟著其他的文檔,如果沒有了才會結(jié)束該進(jìn)程。

number_of_workbooks = excel.Workbooks.Count
if number_of_workbooks > 0:
    logging.debug(
        'there are still %d workbooks opened in excel process, not quit excel application',
        number_of_workbooks
    )
else:
    logging.debug(
        'no workbook opened in excel process, quiting excel application instance ...'
    )
    excel.Quit()

del excel

關(guān)于枚舉常量

Excel API中有各種各樣的枚舉常量,我還沒有找到在Python中直接引用這些常亮的方法,目前的辦法是找到所需的常數(shù)的值,自己定義這些常數(shù)。比如我用到了如下這些枚舉常量:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class ExcelConstants(object):
    # XlFileFormat Enumeration
    xlOpenXMLWorkbook = 51  # Open XML Workbook.

    # XlDVType Enumeration
    xlValidateList = 3  # Value must be present in a specified list.

    # XlDVAlertStyle Enumeration
    xlValidAlertStop = 1  # Stop icon.

    # Constants Enumeration
    xlCenter = -4108

    # XlLineStyle enumeration
    xlContinuous = 1

要想知道某一個枚舉常量的數(shù)值,可以查閱MSDN中Excel Enumerations相關(guān)的資料。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    精产国品一二三区麻豆| 国产精品日韩欧美一区二区| 男女一进一出午夜视频| 国产午夜福利片在线观看| 亚洲午夜精品视频观看| 日韩欧美三级视频在线| 国产精品一区二区有码| 欧美精品二区中文乱码字幕高清 | 国产精品亚洲综合天堂夜夜| 日本一二三区不卡免费| 日韩成人h视频在线观看| 婷婷色香五月综合激激情| 最新69国产精品视频| 国产精品涩涩成人一区二区三区| 青青操精品视频在线观看| 最近日韩在线免费黄片| 欧美日韩在线观看自拍| 久久夜色精品国产高清不卡| 国产中文字幕一区二区| 亚洲中文字幕视频一区二区| 91亚洲人人在字幕国产| 日本一区不卡在线观看| 日韩中文字幕人妻精品| 成年午夜在线免费视频| 欧美黄色成人真人视频| 美女被后入视频在线观看| 中文字幕一区二区三区中文| 亚洲精品福利视频在线观看| 国产内射在线激情一区| 不卡免费成人日韩精品| 成人精品欧美一级乱黄| 成年女人下边潮喷毛片免费| 人妻熟女中文字幕在线| 国产精品一区二区视频大全| 欧美在线观看视频免费不卡| 亚洲欧洲成人精品香蕉网| 亚洲天堂国产精品久久精品| 欧美日韩少妇精品专区性色| 免费黄色一区二区三区| 日本精品理论在线观看| 日本女优一区二区三区免费|