我在开发过程中遇到一个奇怪的问题,使用 Python 的 mimetypes 去猜一个电子表格是 xls 还是 xlsx,从而决定使用 xlrd 还是 pyopenxl 去处理文件,本地电脑(Windows 10)可以正常分辨,但是部署到服务器(Windows Server 2008)之后,解析 xls 没问题,解析 xslx 总是返回 None,我百思不得其解,后来终于在注册表中发现了一些端倪。

image-20221118083502673

在查看 mimetypes 的文档时我发现,在 Windows 平台上,它是通过读取注册表来将各种格式读进去,从而进行分辨的。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import mimetypes
from .utils import XLSParser, XLSXParser

TYPES = {
    'application/vnd.ms-excel': XLSParser,
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': XLSXParser
}

cType, encoding = mimetypes.guess_type(file.url)
parser = TYPES[cType](file.path)

而由于 Windows Server 2008 比较旧,而且没有安装 MS Office,所以注册表里面只有 xls 格式,而没有 xlsx 格式,就导致 mimetypes 在遇到后缀名为 xlsx 的时候没法将 Content Type 对应到 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,而解决方式也很简单,只需要在注册表中添加该格式即可:

定位到 计算机\HKEY_CLASSES_ROOT,右键,新建项,命名为后缀名,例如这里是 .xlsx

image-20221118165044988

然后点击新建的项,在右边空白处右键,新建字符串值

image-20221118165450150

然后将字符串值的名称设置为 Content Type,值设置为 mimetype,具体某个格式的 mimetype 可以上网搜。

image-20221118170230714