轉自: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()