用 Python 解析 Excel 发现的小坑

最近用 Python的 xlrd 解析 Excel 发现了一个小坑,记录一下。

xlrd 和 openpyxl

这两个lib,常用的功能应该都有了,但是读取速度差异非常大。

Excel Size xlrd openpyxl
2 M 5 sec 10 sec
150 M 6 min 20 min

经过试验果断选择了 xlrd。

Excel里面的日期

最重要的原理是,Excel 并不保存日期,而是保存距离某个起始时间点(比如1900-1-1 零点)的一个数值,需要显示的时候,再进行加减运算,根据设置的格式显示出来。
这样我们看上去是日期,但是代码看到的却是一个数值。
然而,不同的操作系统上的Excel,对这个起始时间点的定义却不一样:

Windows: 1899-12-31T00:00:00
macOS  : 1904-01-01T00:00:00

参考链接:Dates in Excel spreadsheets

这样保存的数值就不一样,如果把 Windows 上生成的 Excel,拿到 macOS 下想做点什么,可就要小心了。

那么处理 Excel 的时候,怎么知道这个文件到底是 Windows格式的,还是 macOS格式的呢,可以看 datamode 这个变量。

datemode = 0
    Which date system was in force when this file was last saved.
    0:
        1900 system (the Excel for Windows default).
    1:
        1904 system (the Excel for Macintosh default).

当然,默认情况是 Windows。参考链接:datamode

此外,单元格Cell是文本,还是数值,还是日期,可以查看 Cell.ctype 的值。详细参考:Cell