我现在写一个程序处理各种不同来源的Excel文件,有时会面临这样一种场景:某个sheet中只有几十行有数据,后面的空白行填满了1048553(xlsx文件最大行数1048576)行。因为不能修改源文件,同时这些文件只需要读一次所以没必要预处理。我用openpyxl、pandas、xlrd(2.0版本不再支持xlsx文件,因此我用的1.2版本)、xlwings分别读取测试性能,结果如下:
openpyxl读取得到1048553行,耗时32秒
pandas读取得到1048553行(包括表头行),耗时49秒
xlrd读取得到63行,耗时15秒(将xlrd获取的数据用遍历方式读入list再转化为DataFrame的操作,耗时微秒级)
xlwings读取得到1048553行,耗时6秒(将xlwings获取的数据用expand方法读入list可以获得正确的行数,再转化为DataFrame的操作,耗时毫秒级)
后来找了另一个文件测试,该sheet的特点是每一行都非空,但大部分行只有几个关键列有数据,xlwings的expand方法一旦遇到某一行第一个单元格为空就停止读取,导致并不能得到完整数据
用xlrd需要自己分析表格结构,好处是适用性强,可以通过遍历来得到多层表头结构,后期导入pandas也方便快捷;pandas会自动将第一行视为表头,表头后面的行全部视为数据,应该是无法理解你的多层表头结构的