之前项目的脚本一直在用xlrd解析xlsx文件,后来出了点问题,以为是xlrd版本过时,就用openpyxl重写一下,写完之后发现问题并不是出在xlrd本身,后来就用这两个库同时解析,相当于互相校验了。希望本文能给有需要的同学提供一个参考。
xlrd
pip3 install xlrd=1.2.0
1.2.0之后的版本不再支持xlsx文件,只支持xls文件了,但我们日常使用估计90%以上都是xlsx文件了,因此只能安装1.2.0这个特定版本。
openpyxl
pip3 install openpyxl
xlrd
import xlrd
openpyxl
import openpyxl
xlrd
wb = xlrd.open_workbook(xlsxPath,encoding_override='utf-8')
openpyxl
wb = openpyxl.load_workbook(xlsPath, data_only=True)
这里如果不加 data_only=True 单元格公式读出的内容是公式,而不是结果。
xlrd
sheetNames = list(wb.sheet_names())
for sheetname in sheetNames:
sheet = wb.sheet_by_name(sheetname)
...
openpyxl
sheetNames = wb.sheetnames
for sheetname in sheetNames:
sheet = wb[sheetname]
...
xlrd
rowCount = sheet.nrows
colCount = sheet.ncols
openpyxl
rowCount = sheet.max_row
colCount = sheet.max_column
xlrd
for row in range(0,rowCount):
for col in range(0,colCount):
cellValue = sheet.cell(row,col).value
if cellValue == None:
continue
...
openpyxl
for row in range(1,rowCount+1):
for col in range(1,colCount+1):
cellValue = sheet.cell(row,col).value
if cellValue == None:
continue
...
特别注意下 openpyxl 的行列索引是从1开始的。
另外,有些数字读出来两者格式会有一些差异,这个需要根据情况自行处理下。
其它方法参数请参考API文档吧
xlrd
https://xlrd.readthedocs.io/en/latest/
openpyxl
https://openpyxl.readthedocs.io/en/stable/
总体上说两者功能上比较接近,性能上xlrd的读取速度明显要优于openpyxl,但一般使用场景对性能要求没那么高的可以忽略。而对于新特性的支持方面,openpyxl显然更有优势,至少我们可以用到他的新版本,而xlrd我们目前只能停留在1.2.0这个特定版本上了。