扩展 openpyxl 对 Excel 中自定义单元格格式的处理
背景
在用 openpyxl 读取 Excel 中的数据时,发现某些单元格读取到的是数字 44712,但打开 Excel 文件却显示的是时间:2022年6月2日
查看单元格格式会发现这个单元格属于自定义格式中的: yyyy”年”m”月”d”日”。这个可以理解,但为啥 openpyxl 读到的不是时间呢?
原因分析
通过查看 openpyxl 的源码,发现其在 openpyxl.styles.numbers.py 中定义了一组格式,如下
1 | BUILTIN_FORMATS = { |
其中并没有我们想要的 yyyy”年”m”月”d”日”。
然后通过查阅 Excel 的官方文档中关于 NumberingFormat Class 的解释发现 openpyxl 中定义的这些格式属于通用格式,是不区分语种的。
而我们想要找的这种格式,属于汉语中的特殊格式。对于这种特殊格式, Excel 中仅保存一个格式 ID ,但不保存具体格式的定义,格式的定义会随着所在国家发生变化。
解决方案
解决方案很简单,从文档中找到中文对应的格式 ID 和格式字符串的对应关系,然后采用 hook 的方式将其注入 openpyxl 模块中即可。
代码如下:(注意这些代码需要在导入 openpyxl 模块之前执行)
1 | # 扩展openpyxl的数字格式 |
参考文档: