Python讀寫excel庫對比

原文鏈接:https://blog.csdn.net/qq_34617032/article/details/80433939

感謝 ChrisMinions,原文鏈接https://blog.csdn.net/qq_34617032/article/details/80433939

常見庫簡介
xlrd
xlrd是一個從Excel文件讀取數據和格式化信息的庫,支持.xls以及.xlsx文件。
http://xlrd.readthedocs.io/en/latest/
    1、xlrd支持.xls,.xlsx文件的讀
    2、通過設置on_demand變量使open_workbook()函數只加載那些需要的sheet,從而節省時間和內存(該方法對.xlsx文件無效)。
    3、xlrd.Book對象有一個unload_sheet方法,它將從內存中卸載工作表,由工作表索引或工作表名稱指定(該方法對.xlsx文件無效)

xlwt
xlwt是一個用於將數據和格式化信息寫入舊Excel文件的庫(如.xls)。
https://xlwt.readthedocs.io/en/latest/
    1、xlwt支持.xls文件寫。

xlutils
xlutils是一個處理Excel文件的庫,依賴於xlrd和xlwt。
http://xlutils.readthedocs.io/en/latest/
    1、xlutils支持.xls文件。
    2、支持Excel操作。

xlwings
xlwings是一個可以實現從Excel調用Python,也可在python中調用Excel的庫。
http://docs.xlwings.org/en/stable/index.html
    1、xlwings支持.xls讀,支持.xlsx文件讀寫。
    2、支持Excel操作。
    3、支持VBA。
    4、強大的轉換器可以處理大部分數據類型,包括在兩個方向上的numpy array和pandas DataFrame。

openpyxl
openpyxl是一個用於讀取和編寫Excel 2010 xlsx/xlsm/xltx/xltm文件的庫。
https://openpyxl.readthedocs.io/en/stable/
    1、openpyxl支持.xlsx文件的讀寫。
    2、支持Excel操作。
    3、加載大.xlsx文件可以使用read_only模式。
    4、寫入大.xlsx文件可以使用write_only模式。

xlsxwriter
xlsxwriter是一個用於創建Excel .xlsx文件的庫。
https://xlsxwriter.readthedocs.io/
    1、xlswriter支持.xlsx文件的寫。
    2、支持VBA。
    3、寫入大.xlsx文件時使用內存優化模式。

win32com
win32com庫存在於pywin32中,是一個讀寫和處理Excel文件的庫。
http://pythonexcels.com/python-excel-mini-cookbook/
    1、win32com支持.xls,.xlsx文件的讀寫,支持.xlsx文件的寫。
    2、支持Excel操作。

DataNitro
DataNitro是一個內嵌在Excel中的插件。
https://datanitro.com/docs/ 
    1、DataNitro支持.xls,.xlsx文件的讀寫。
    2、支持Excel操作。
    3、支持VBA。
    4、收費

pandas
pandas通過對Excel文件的讀寫實現數據輸入輸出
http://pandas.pydata.org/
    1、pandas支持.xls,.xlsx文件的讀寫。
    2、支持只加載每個表的單一工作頁。

環境配置及可實現操作


注:DataNitro作爲插件使用需依託軟件本身。
參考:https://zhuanlan.zhihu.com/p/23998083

讀寫測試

測試計算機硬件和系統
電腦型號    微星 MS-7846 臺式電腦 
操作系統    Windows 7 旗艦版 64位 SP1 ( DirectX 11 )
處理器    英特爾 Pentium(奔騰) G3260 @ 3.30GHz 雙核
主板    微星 H81M-P32L (MS-7846) ( 英特爾 Haswell - Lynx Point )
內存    4 GB ( 金士頓 DDR3 1600MHz )
主硬盤    西數 WDC WD5000AZLX-00ZR6A0 ( 500 GB / 7200 轉/分 )
顯卡    英特爾 Haswell Integrated Graphics Controller ( 256 MB / 微星 )

測試用例
用例1. 讀.xls文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數)。
用例2. 讀.xlsx文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數)。
用例3. 讀.xls文件的整個表(表有1個分頁,頁有2000行1200列的整數)。
用例4. 讀.xlsx文件的整個表(表有1個分頁,頁有2000行1200列的整數)。
用例5. 寫.xls文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數)。
用例6. 寫.xlsx文件的整個表(表有5個分頁,每個分頁有2000行1200列的整數)。
用例7. 寫.xls文件的整個表(表有1個分頁,頁有2000行1200列的整數)。
用例8. 寫.xlsx文件的整個表(表有1個分頁,頁有2000行1200列的整數)。

測試結果

    注1.xlwt和pandas每個工作頁最多寫入256列,因此測試用例修改爲每頁有2000行256列的整數.
    注2.xlutils讀寫依賴於xlrd和xlwt,不單獨測試。
    注3.openpyxl測試兩種模式,一是普通加載寫入,二是read_only/write_only模式下的加載寫入。
    注4.DataNitro要收費,且需依託Excel使用,本次不測試。

讀寫性能比較
    單從讀寫的性能上考慮,win32com的性能是最好的,xlwings其次。
    openpyxl雖然操作Excel的功能強大,但讀寫性能過於糟糕,尤其是寫大表時,會佔用大量內存(把我的4G內存用完了),開啓read_only和write_only模式後對其性能有大幅提升,尤其是對讀的性能提升很大,使其幾乎不耗時(0.01秒有點誇張,不過確實是加載上了)。pandas把Excel當作數據讀寫的容器,爲其強大的數據分析服務,因此讀寫性能表現中規中矩,但其對Excel文件兼容性是最好的,支持讀寫.xls,.xlsx文件,且支持只讀表中單一工作頁。同樣支持此功能的庫還有xlrd,但xlrd只支持讀,並不支持寫,且性能不突出,需要配合xlutils進行Excel操作,並使用xlwt保存數據,而xlwt只能寫入.xls文件(另一個可以寫入.xls文件的庫是pandas,且這兩個寫入的Excel文件最多只能有256列,其餘庫就我目前的瞭解均只能寫入.xlsx文件),性能一般。xlsxwriter功能單一,一般用來創建.xlsx文件,寫入性能中庸。win32com擁有最棒的讀寫性能,但該庫存在於pywin32的庫中,自身沒有完善的文檔,使用略吃力。xlwings擁有和win32com不相伯仲的讀寫性能,強大的轉換器可以處理大部分數據類型,包括二維的numpy array和pandas DataFrame,可以輕鬆搞定數據分析的工作。
    綜合考慮,xlwings的表現最佳,正如其名,xlwings——Make Excel Fly!

便捷性比較
    本測試目前只是針對Excel文件的讀寫,並未涉及Excel操作,單從讀寫的便捷性來講,各庫的表現難分上下,但是win32com和xlwings這兩個庫可以在程序運行時實時在打開的Excel文件中進行操作,實現過程的可視化,其次xlwings的數據結構轉換器使其可以快速的爲Excel文件添加二維數據結構而不需要在Excel文件中重定位數據的行和列,因此從讀寫的便捷性來比較,仍是xlwings勝出。

測試代碼
計時

import timeit  
  
if __name__ == '__main__':  
    # 使用timeit計時  
    t = timeit.Timer('??()', setup='from __main__ import ??')  
    print(t.timeit(number=1))
xlrd

import 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)  
    f.sheet_by_index(0)
xlwt

import xlwt  
  
book = xlwt.Workbook()  
def test_xlwt():  
    for s in range(5):  
        sheet = book.add_sheet(str(s))  
        for i in range(2000):  
            for j in range(256):  
                sheet.write(i, j, 65536)  
    book.save('test_cases\\write_xls.xls')  
xlwings

import xlwings  
  
def test_xlwings_read():  
    # f = xlwings.Book('test_cases\\read_xls.xls') 
    f = xlwings.Book('test_cases\\read_xlsx.xlsx')  
  
import numpy as np  
  
f = xlwings.Book('')  
d = np.zeros([2000, 1200])  
d += 65536  
 
def test_xlwings_write():  
    for s in range(1):  
        sheet = f.sheets.add()  
        sheet.range('A1').value = d  
    f.save('test_cases\\write_xlsx.xlsx') 
openpyxl

import openpyxl  
  
def test_openpyxl_read():  
    f = openpyxl.load_workbook('test_cases\\read_xlsx.xlsx', read_only=True)  
  
  
c = [65536] * 1200  
f = openpyxl.Workbook(write_only=True)  
  
def test_openpyxl_write():  
    for i in range(1):  
        sheet = f.create_sheet(title=str(i))  
        for row in range(2000):  
            sheet.append(c)  
    f.save('test_cases\\write_xlsx.xlsx')  
xlsxwriter

import xlsxwriter  
  
workbook = xlsxwriter.Workbook('test_cases\\write_xlsx.xlsx')  
def test_xlsxwriter():  
    for s in range(1):  
        worksheet = workbook.add_worksheet()  
        for i in range(2000):  
            for j in range(1200):  
                worksheet.write(i, j, 65536)  
    workbook.close() 
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')
    # excel.Visible = True  
  
  
wb = excel.Workbooks.Add()  
def test_win32com_write():  
    for i in range(1):  
        ws = wb.Worksheets.Add()  
        ws.Range("A1:ATD2000").Value = 65536  
  
    wb.SaveAs('E:\\excel\\test_cases\\write_xlsx.xlsx')  
    excel.Application.Quit()  
pandas

import pandas as pd  
  
def test_pandas_read():  
    for i in range(1, 6):  
        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)  
  
  
import numpy as np  
d = np.zeros([2000, 255])  
d += 65536  
df = pd.DataFrame(d)  
# writer = pd.ExcelWriter('test_cases\\write_xls.xls')
writer = pd.ExcelWriter('test_cases\\write_xlsx.xlsx')  
def test_pandas_write():  
    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')  
    writer.save() 
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章