知行编程网知行编程网  2022-09-16 05:00 知行编程网 隐藏边栏  689 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于如何解决运行较大excel文件openpyxl变慢问题的相关知识,包括excel慢要怎么解决,以及某excel文件保存速度很慢这些编程知识,希望对大家有参考作用。

打开小文件时我通常不注意。偶尔有大excel要跑的时候,会出现openpyxl变慢的问题。今天教大家如何解决openpyxl运行大excel文件变慢的问题。


运行以下代码:

<p><span> from openpyxl import Workbook
  from openpyxl.utils import get_column_letter
  from openpyxl import load_workbook
  import time
  wb = load_workbook("E:/a.xlsx", read_only=True)
  sh = wb["Sheet"]
  # rowItem = {}
  # for j in range(1,2000):
  #   for i in range(1, 30):
  #     rowItem[get_column_letter(i)] = i
  #   sh.append(rowItem)
  # wb.save("E:/a.xlsx")
  t0 = time.time()
  print(sh['V500'].value)
  t1 = time.time()
  print("openpyxl所用时间:", str(t1-t0))

  import xlrd
  xlsPath = "E:/a.xlsx"
  WorkBook = xlrd.open_workbook(xlsPath)
  sh = WorkBook.sheet_by_name("Sheet")

  t0 = time.time()
  print(sh.cell(499,22).value)
  t1 = time.time()
  print("xlrd所用时间:", str(t1-t0))<br/></span></p>



测试结果:

<p><span>22
openpyxl所用时间: 0.44217610359191895
23.0
xlrd所用时间: 0.0010063648223876953<br/></span></p>



结论


openpyxl的慢是读取慢,可以选择

xlrd代替

,详细测试下面继续。


不直接使用xlwt+xlrd是因为xlwt仅支持

2003

及以下版本,行数限制在

65536

,不够用,而openpyxl大概在

一百多万


主要说完了,下面详细说下: 写工具时遇到的问题,最初是用xlwt+xlrd,后来行数超标,没办法切换到openpyxl使用excel2007版本,原来测试不到三万行的数据,只需要三四秒。切换到openpyxl后,花了几分钟,没看到多少。加了函数运行时间的监视器后,看的时候发现是有问题。



推测原因:

想必openpyxl在根据行号和列号读取的时候,从第一行第一列开始遍历,直到行号等于指定行号,列号等于指定列号,所以要读取的行号和列号越多越慢,(可能从有数据的第一行或第一列开始),和xlrd类似数组,我们需要取第一个元素,直接找第一个元素内存中对应的地址根据下标就可以了,所以不管excel的总量,速度基本是一样的。



知识拓展:


xlwt写入仅支持

65536

行,那

xlrd

的读取很可能也是,也就是超过这么多的数据可能也会出错。

因为我是读取多表数据生成单表数据,生成方式大概是Na*Nb,所以实际读取并没有太多,而是生成了很多,所以基本上可以考虑这个问题。

另外,据说xlrd偶尔会出现读取xlsx格式的问题。

最后,顺便说一下,一个监控函数运行时间的装饰器:

<p><span>import time
from functools import wraps

def fn_timer(function):
  @wraps(function)
  def function_timer(*args, **kwargs):
    t0 = time.time()
    result = function(*args, **kwargs)
    t1 = time.time()
    print ("Total time running %s: %s seconds" %
      (function.__name__, str(t1-t0))
      )
    return result
  return function_timer<br/></span></p>


使用方式的话,就是在要监控的函数定义上面加上

@fn_timer

就行了。


相信下次你用openpyxl打开大excel文件的时候,就不用慢慢等了。更多Python学习推荐:



本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享