确定xlsx单元格是否为Excel 2007电子表格的date格式
我正在处理一些通过parsingxml从xlsx文件中读取数据的代码。 这是非常简单的,除了date单元格。
date存储为整数,并具有“s”属性,该属性是样式表中的索引,可用于获取date格式化string。 以下是一些以前链接的问题的例子:
19 ='h:mm:ss AM / PM';
20 ='h:mm';
21 ='h:mm:ss';
22 ='m / d / yy h:mm';
这些是来自ooxml标准的内置date格式化string,但是看起来像excel往往使用自定义格式化的string而不是内置的。 以下是Excel 2007电子表格的示例格式。 numFmtId大于164是一种自定义格式。
<numFmt formatCode="MM/DD/YY" numFmtId="165"/>
确定一个单元格是否应该格式化为一个date是困难的,因为唯一的指标,我可以find的是formatCode。 这一个显然是一个date,但单元格可以被格式化任何方式。 我最初的尝试是在formatCode中查找Ms,Ds和Ys,但似乎有问题。
有没有人有这个问题的运气? 看来标准的Excel阅读库目前缺乏xlsx支持。 我已经阅读了标准,并通过很多xlsx文件挖掘没有太多的运气。
最好的信息似乎来自这个stackoverflow问题:
什么表示办公室打开xml单元格包含date时间值
谢谢!
date存储为整数
在Excel数据模型中,确实没有整数这样的东西。 一切都是浮动的。 date和date时间是花车,代表天和一个分数,因为一个可变的时代。 时间是一天中的一小部分。
看来标准的Excel阅读库目前缺乏xlsx支持。
谷歌( “xlsxrd”)。 要保持最新,请joinpython-excel组 。
编辑我看到你已经在那里问了一个问题 。 如果您提出的问题与此问题相同,或者回复了我的澄清要求,您将在两周前获得此信息。
看看xlrd文档。 前面有一个关于Exceldate的讨论。 所有这些都适用于Excel 2007以及早期版本。 特别是:有必要分析自定义格式。 有必要有一个“标准”格式索引表格用于date格式。 某些地方列出的“标准”格式不包括在CJK语言环境中使用的格式。
给你的选项:
(1)从xlrd
源代码中借用,包括xldate_as_tuple函数。
(2)选项(1)+获取xlsxrd
螺栓连接工具包,并从其源代码中借用。
(3)[推荐]获取xlsxrd
包并使用它…您将获得一组可在Excel版本2.0到2007和Python版本2.1到2.7之间运行的API。
在数字格式代码中查找Ms,Ds和Ys是不够的
[Red]#,##0 ;[Yellow](#,##0)
是完全有效的数字格式,它包含Y和D,但不是date格式。 我专门testing了方括号外的任何标准date/时间格式字符('y','m','d','H','i','s')('[''] “)。 即使这样,我发现有一些误报正在消失,主要与会计和货币格式有关。 因为它们通常以下划线('_')或空格后跟零('0')(我在date格式中没有遇到过这两个空格)开始,所以我明确地过滤掉了这些值。
我的(PHP)代码的一部分,用于确定格式掩码是否为date:
private static $possibleDateFormatCharacters = 'ymdHis'; // Typically number, currency or accounting (or occasionally fraction) formats if ((substr($pFormatCode,0,1) == '_') || (substr($pFormatCode,0,2) == '0 ')) { return false; } // Try checking for any of the date formatting characters that don't appear within square braces if (preg_match('/(^|\])[^\[]*['.self::$possibleDateFormatCharacters.']/i',$pFormatCode)) { return true; } // No date... return false;
我相信可能还有一些我很遗憾的例外,但是(如果是的话)他们可能是极端的例子