当前位置: 移动技术网 > IT编程>脚本编程>Python > Python读写Excel文件第三方库汇总,你想要的都在这儿!

Python读写Excel文件第三方库汇总,你想要的都在这儿!

2019年09月22日  | 移动技术网IT编程  | 我要评论

sopcast官网,伊藤舞,素颜格格 人莫予毒

---恢复内容开始---

常见库简介

xlrd

xlrd是一个从excel文件读取数据和格式化信息的库,支持.xls以及.xlsx文件。

1、xlrd支持.xls,.xlsx文件的读
2、通过设置on_demand变量使open_workbook()函数只加载那些需要的sheet,从而节省时间和内存(该方法对.xlsx文件无效)。
3、xlrd.book对象有一个unload_sheet方法,它将从内存中卸载工作表,由工作表索引或工作表名称指定(该方法对.xlsx文件无效)

xlwt

xlwt是一个用于将数据和格式化信息写入旧excel文件的库(如.xls)。

1、xlwt支持.xls文件写。

xlutils

xlutils是一个处理excel文件的库,依赖于xlrd和xlwt。

1、xlutils支持.xls文件。
2、支持excel操作。

xlwings

xlwings是一个可以实现从excel调用python,也可在python中调用excel的库。

1、xlwings支持.xls读,支持.xlsx文件读写。
2、支持excel操作。
3、支持vba。
4、强大的转换器可以处理大部分数据类型,包括在两个方向上的numpy array和pandas dataframe。

openpyxl

openpyxl是一个用于读取和编写excel 2010 xlsx/xlsm/xltx/xltm文件的库。小编整理一套python资料和pdf,有需要python学习资料可以加学习群:631441315 ,反正闲着也是闲着呢,不如学点东西啦~~

1、openpyxl支持.xlsx文件的读写。
2、支持excel操作。
3、加载大.xlsx文件可以使用read_only模式。
4、写入大.xlsx文件可以使用write_only模式。

xlsxwriter

xlsxwriter是一个用于创建excel .xlsx文件的库。

1、xlswriter支持.xlsx文件的写。
2、支持vba。
3、写入大.xlsx文件时使用内存优化模式。

win32com

win32com库存在于pywin32中,是一个读写和处理excel文件的库。

1、win32com支持.xls,.xlsx文件的读写,支持.xlsx文件的写。
2、支持excel操作。

datanitro

datanitro是一个内嵌在excel中的插件。

1、datanitro支持.xls,.xlsx文件的读写。
2、支持excel操作。
3、支持vba。
4、收费

pandas

pandas通过对excel文件的读写实现数据输入输出

1、pandas支持.xls,.xlsx文件的读写。
2、支持只加载每个表的单一工作页。

环境配置及可实现操作

注:datanitro作为插件使用需依托软件本身。
参考:

读写测试

测试计算机硬件和系统

电脑型号 微星 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() 

 

---恢复内容结束---

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网