常見庫簡介xlrd
xlrd是一個從Excel文件讀取數(shù)據(jù)和格式化信息的庫,支持.xls以及.xlsx文件。 http://xlrd./en/latest/ 1、xlrd支持.xls,.xlsx文件的讀 2、通過設(shè)置on_demand變量使open_workbook()函數(shù)只加載那些需要的sheet,從而節(jié)省時間和內(nèi)存(該方法對.xlsx文件無效)。 3、xlrd.Book對象有一個unload_sheet方法,它將從內(nèi)存中卸載工作表,由工作表索引或工作表名稱指定(該方法對.xlsx文件無效) xlwt xlwt是一個用于將數(shù)據(jù)和格式化信息寫入舊Excel文件的庫(如.xls)。 https://xlwt./en/latest/ 1、xlwt支持.xls文件寫。 xlutils
xlutils是一個處理Excel文件的庫,依賴于xlrd和xlwt。 http://xlutils./en/latest/ 1、xlutils支持.xls文件。 2、支持Excel操作。 xlwings
xlwings是一個可以實現(xiàn)從Excel調(diào)用Python,也可在python中調(diào)用Excel的庫。 http://docs./en/stable/index.html 1、xlwings支持.xls讀,支持.xlsx文件讀寫。 2、支持Excel操作。 3、支持VBA。 4、強大的轉(zhuǎn)換器可以處理大部分?jǐn)?shù)據(jù)類型,包括在兩個方向上的numpy array和pandas DataFrame。 openpyxl openpyxl是一個用于讀取和編寫Excel 2010 xlsx/xlsm/xltx/xltm文件的庫。 https://openpyxl./en/stable/ 1、openpyxl支持.xlsx文件的讀寫。 2、支持Excel操作。 3、加載大.xlsx文件可以使用read_only模式。 4、寫入大.xlsx文件可以使用write_only模式。 xlsxwriter xlsxwriter是一個用于創(chuàng)建Excel .xlsx文件的庫。 https://xlsxwriter./ 1、xlswriter支持.xlsx文件的寫。 2、支持VBA。 3、寫入大.xlsx文件時使用內(nèi)存優(yōu)化模式。 win32com
win32com庫存在于pywin32中,是一個讀寫和處理Excel文件的庫。 http:///python-excel-mini-cookbook/ 1、win32com支持.xls,.xlsx文件的讀寫,支持.xlsx文件的寫。 2、支持Excel操作。 DataNitro DataNitro是一個內(nèi)嵌在Excel中的插件。 https:///docs/ 1、DataNitro支持.xls,.xlsx文件的讀寫。 2、支持Excel操作。 3、支持VBA。 4、收費 pandas pandas通過對Excel文件的讀寫實現(xiàn)數(shù)據(jù)輸入輸出 http://pandas./ 1、pandas支持.xls,.xlsx文件的讀寫。 2、支持只加載每個表的單一工作頁。 環(huán)境配置及可實現(xiàn)操作
注:DataNitro作為插件使用需依托軟件本身。 參考:https://zhuanlan.zhihu.com/p/23998083 讀寫測試 測試計算機硬件和系統(tǒng)電腦型號 微星 MS-7846 臺式電腦 操作系統(tǒng) Windows 7 旗艦版 64位 SP1 ( DirectX 11 ) 處理器 英特爾 Pentium(奔騰) G3260 @ 3.30GHz 雙核 主板 微星 H81M-P32L (MS-7846) ( 英特爾 Haswell - Lynx Point ) 內(nèi)存 4 GB ( 金士頓 DDR3 1600MHz ) 主硬盤 西數(shù) WDC WD5000AZLX-00ZR6A0 ( 500 GB / 7200 轉(zhuǎn)/分 ) 顯卡 英特爾 Haswell Integrated Graphics Controller ( 256 MB / 微星 ) 測試用例用例1. 讀.xls文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數(shù))。 用例2. 讀.xlsx文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數(shù))。 用例3. 讀.xls文件的整個表(表有1個分頁,頁有2000行1200列的整數(shù))。 用例4. 讀.xlsx文件的整個表(表有1個分頁,頁有2000行1200列的整數(shù))。 用例5. 寫.xls文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數(shù))。 用例6. 寫.xlsx文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數(shù))。 用例7. 寫.xls文件的整個表(表有1個分頁,頁有2000行1200列的整數(shù))。 用例8. 寫.xlsx文件的整個表(表有1個分頁,頁有2000行1200列的整數(shù))。
測試結(jié)果
注1.xlwt和pandas每個工作頁最多寫入256列,因此測試用例修改為每頁有2000行256列的整數(shù). 注2.xlutils讀寫依賴于xlrd和xlwt,不單獨測試。 注3.openpyxl測試兩種模式,一是普通加載寫入,二是read_only/write_only模式下的加載寫入。 注4.DataNitro要收費,且需依托Excel使用,本次不測試。 讀寫性能比較 單從讀寫的性能上考慮,win32com的性能是最好的,xlwings其次。 openpyxl雖然操作Excel的功能強大,但讀寫性能過于糟糕,尤其是寫大表時,會占用大量內(nèi)存(把我的4G內(nèi)存用完了),開啟read_only和write_only模式后對其性能有大幅提升,尤其是對讀的性能提升很大,使其幾乎不耗時(0.01秒有點夸張,不過確實是加載上了)。pandas把Excel當(dāng)作數(shù)據(jù)讀寫的容器,為其強大的數(shù)據(jù)分析服務(wù),因此讀寫性能表現(xiàn)中規(guī)中矩,但其對Excel文件兼容性是最好的,支持讀寫.xls,.xlsx文件,且支持只讀表中單一工作頁。同樣支持此功能的庫還有xlrd,但xlrd只支持讀,并不支持寫,且性能不突出,需要配合xlutils進行Excel操作,并使用xlwt保存數(shù)據(jù),而xlwt只能寫入.xls文件(另一個可以寫入.xls文件的庫是pandas,且這兩個寫入的Excel文件最多只能有256列,其余庫就我目前的了解均只能寫入.xlsx文件),性能一般。xlsxwriter功能單一,一般用來創(chuàng)建.xlsx文件,寫入性能中庸。win32com擁有最棒的讀寫性能,但該庫存在于pywin32的庫中,自身沒有完善的文檔,使用略吃力。xlwings擁有和win32com不相伯仲的讀寫性能,強大的轉(zhuǎn)換器可以處理大部分?jǐn)?shù)據(jù)類型,包括二維的numpy array和pandas DataFrame,可以輕松搞定數(shù)據(jù)分析的工作。 綜合考慮,xlwings的表現(xiàn)最佳,正如其名,xlwings——Make Excel Fly! 便捷性比較 本測試目前只是針對Excel文件的讀寫,并未涉及Excel操作,單從讀寫的便捷性來講,各庫的表現(xiàn)難分上下,但是win32com和xlwings這兩個庫可以在程序運行時實時在打開的Excel文件中進行操作,實現(xiàn)過程的可視化,其次xlwings的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換器使其可以快速的為Excel文件添加二維數(shù)據(jù)結(jié)構(gòu)而不需要在Excel文件中重定位數(shù)據(jù)的行和列,因此從讀寫的便捷性來比較,仍是xlwings勝出。
測試代碼計時 if __name__ == '__main__': t = timeit.Timer('??()', setup='from __main__ import ??') print(t.timeit(number=1))
xlrd def test_xlrd_on_demand_false(): # f = xlrd.open_workbook('test_cases\\read_xls.xls', on_demand=False) f = xlrd.open_workbook('test_cases\\read_xlsx.xlsx', on_demand=False) def test_xlrd_on_demand_true(): # f = xlrd.open_workbook('test_cases\\read_xls.xls', on_demand=True) f = xlrd.open_workbook('test_cases\\read_xlsx.xlsx', on_demand=True)
xlwt sheet = book.add_sheet(str(s)) book.save('test_cases\\write_xls.xls')
xlwings # f = xlwings.Book('test_cases\\read_xls.xls') f = xlwings.Book('test_cases\\read_xlsx.xlsx') d = np.zeros([2000, 1200]) def test_xlwings_write(): sheet.range('A1').value = d f.save('test_cases\\write_xlsx.xlsx')
openpyxl def test_openpyxl_read(): f = openpyxl.load_workbook('test_cases\\read_xlsx.xlsx', read_only=True) f = openpyxl.Workbook(write_only=True) def test_openpyxl_write(): sheet = f.create_sheet(title=str(i)) f.save('test_cases\\write_xlsx.xlsx')
xlsxwriter
workbook = xlsxwriter.Workbook('test_cases\\write_xlsx.xlsx') worksheet = workbook.add_worksheet() worksheet.write(i, j, 65536)
win32com
import win32com.client as win32 excel = win32.gencache.EnsureDispatch('Excel.Application') def test_win32com_read(): # wb = excel.Workbooks.Open('E:\\excel\\test_cases\\read_xls.xls') wb = excel.Workbooks.Open('E:\\excel\\test_cases\\read_xlsx.xlsx') wb = excel.Workbooks.Add() def test_win32com_write(): ws.Range("A1:ATD2000").Value = 65536 wb.SaveAs('E:\\excel\\test_cases\\write_xlsx.xlsx')
pandas
sheet_name = "Sheet" + str(i) # df = pd.read_excel('test_cases\\read_xls.xls', sheet_name) df = pd.read_excel('test_cases\\read_xlsx.xlsx', sheet_name) d = np.zeros([2000, 255]) # writer = pd.ExcelWriter('test_cases\\write_xls.xls') writer = pd.ExcelWriter('test_cases\\write_xlsx.xlsx') df.to_excel(writer, 'Sheet1') df.to_excel(writer, 'Sheet2') df.to_excel(writer, 'Sheet3') df.to_excel(writer, 'Sheet4') df.to_excel(writer, 'Sheet5')
|