zoukankan      html  css  js  c++  java
  • Python读写Excel文件第三方库汇总

    常见库简介

    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胜出。

    测试代码

    计时

    1.  
      import timeit
    2.  
       
    3.  
      if __name__ == '__main__':
    4.  
      # 使用timeit计时
    5.  
      t = timeit.Timer('??()', setup='from __main__ import ??')
    6.  
      print(t.timeit(number=1))

    xlrd

    1.  
      import xlrd
    2.  
       
    3.  
      def test_xlrd_on_demand_false():
    4.  
      # f = xlrd.open_workbook('test_cases\read_xls.xls', on_demand=False)
    5.  
      f = xlrd.open_workbook('test_cases\read_xlsx.xlsx', on_demand=False)
    6.  
       
    7.  
      def test_xlrd_on_demand_true():
    8.  
      # f = xlrd.open_workbook('test_cases\read_xls.xls', on_demand=True)
    9.  
      f = xlrd.open_workbook('test_cases\read_xlsx.xlsx', on_demand=True)
    10.  
      f.sheet_by_index(0)

    xlwt

    1.  
      import xlwt
    2.  
       
    3.  
      book = xlwt.Workbook()
    4.  
      def test_xlwt():
    5.  
      for s in range(5):
    6.  
      sheet = book.add_sheet(str(s))
    7.  
      for i in range(2000):
    8.  
      for j in range(256):
    9.  
      sheet.write(i, j, 65536)
    10.  
      book.save('test_cases\write_xls.xls')

    xlwings

    1.  
      import xlwings
    2.  
       
    3.  
      def test_xlwings_read():
    4.  
      # f = xlwings.Book('test_cases\read_xls.xls')
    5.  
      f = xlwings.Book('test_cases\read_xlsx.xlsx')
    6.  
       
    7.  
      import numpy as np
    8.  
       
    9.  
      f = xlwings.Book('')
    10.  
      d = np.zeros([2000, 1200])
    11.  
      d += 65536
    12.  
       
    13.  
      def test_xlwings_write():
    14.  
      for s in range(1):
    15.  
      sheet = f.sheets.add()
    16.  
      sheet.range('A1').value = d
    17.  
      f.save('test_cases\write_xlsx.xlsx')

    openpyxl

    1.  
      import openpyxl
    2.  
       
    3.  
      def test_openpyxl_read():
    4.  
      f = openpyxl.load_workbook('test_cases\read_xlsx.xlsx', read_only=True)
    5.  
       
    6.  
       
    7.  
      c = [65536] * 1200
    8.  
      f = openpyxl.Workbook(write_only=True)
    9.  
       
    10.  
      def test_openpyxl_write():
    11.  
      for i in range(1):
    12.  
      sheet = f.create_sheet(title=str(i))
    13.  
      for row in range(2000):
    14.  
      sheet.append(c)
    15.  
      f.save('test_cases\write_xlsx.xlsx')

    xlsxwriter

    1.  
      import xlsxwriter
    2.  
       
    3.  
      workbook = xlsxwriter.Workbook('test_cases\write_xlsx.xlsx')
    4.  
      def test_xlsxwriter():
    5.  
      for s in range(1):
    6.  
      worksheet = workbook.add_worksheet()
    7.  
      for i in range(2000):
    8.  
      for j in range(1200):
    9.  
      worksheet.write(i, j, 65536)
    10.  
      workbook.close()

    win32com

    1.  
      import win32com.client as win32
    2.  
       
    3.  
      excel = win32.gencache.EnsureDispatch('Excel.Application')
    4.  
      def test_win32com_read():
    5.  
      # wb = excel.Workbooks.Open('E:\excel\test_cases\read_xls.xls')
    6.  
      wb = excel.Workbooks.Open('E:\excel\test_cases\read_xlsx.xlsx')
    7.  
      # excel.Visible = True
    8.  
       
    9.  
       
    10.  
      wb = excel.Workbooks.Add()
    11.  
      def test_win32com_write():
    12.  
      for i in range(1):
    13.  
      ws = wb.Worksheets.Add()
    14.  
      ws.Range("A1:ATD2000").Value = 65536
    15.  
       
    16.  
      wb.SaveAs('E:\excel\test_cases\write_xlsx.xlsx')
    17.  
      excel.Application.Quit()

    pandas

      1.  
        import pandas as pd
      2.  
         
      3.  
        def test_pandas_read():
      4.  
        for i in range(1, 6):
      5.  
        sheet_name = "Sheet" + str(i)
      6.  
        # df = pd.read_excel('test_cases\read_xls.xls', sheet_name)
      7.  
        df = pd.read_excel('test_cases\read_xlsx.xlsx', sheet_name)
      8.  
         
      9.  
         
      10.  
        import numpy as np
      11.  
        d = np.zeros([2000, 255])
      12.  
        d += 65536
      13.  
        df = pd.DataFrame(d)
      14.  
        # writer = pd.ExcelWriter('test_cases\write_xls.xls')
      15.  
        writer = pd.ExcelWriter('test_cases\write_xlsx.xlsx')
      16.  
        def test_pandas_write():
      17.  
        df.to_excel(writer, 'Sheet1')
      18.  
        df.to_excel(writer, 'Sheet2')
      19.  
        df.to_excel(writer, 'Sheet3')
      20.  
        df.to_excel(writer, 'Sheet4')
      21.  
        df.to_excel(writer, 'Sheet5')
      22.  
        writer.save()
  • 相关阅读:
    Rabbit简单测试实例
    RabbitMQ-2 工作队列
    RabbitMQ-1 Helloword
    utmp
    导入wordpress数据库到mysql报错
    Tengine 反向代理状态检测
    阿里云服务器挖矿wipefs处理
    JbossMiner 挖矿蠕虫分析 (转载)
    centos6+nginx+php+mysql+memcached+wordpress
    php安装ZendGuardLoader扩展问题
  • 原文地址:https://www.cnblogs.com/alphacode/p/13696497.html
Copyright © 2011-2022 走看看