确定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; 

我相信可能还有一些我很遗憾的例外,但是(如果是的话)他们可能是极端的例子