确定xlsx单元格是否为Excel 2007电子表格的日期格式

时间:2011-02-09 18:35:43

标签: python excel openxml xlsx

我正在处理一些通过解析xml从xlsx文件中读取数据的代码。除日期单元格外,这一切都非常简单。

日期存储为整数,并具有“s”属性,该属性是样式表的索引,可用于获取日期格式字符串。以下是上一个stackoverflow问题的一些示例:

  

19 ='h:mm:ss AM / PM';

     

20 ='h:mm';

     

21 ='h:mm:ss';

     

22 ='m / d / yy h:mm';

这些是来自ooxml标准的内置日期格式化字符串,但似乎excel倾向于使用自定义格式化字符串而不是内置。以下是Excel 2007电子表格中的示例格式。 numFmtId大于164是一种自定义格式。

<numFmt formatCode="MM/DD/YY" numFmtId="165"/>

确定是否应将单元格格式化为日期很困难,因为我能找到的唯一指标是formatCode。这个显然是一个日期,但细胞可以通过多种方式进行格式化。我最初的尝试是在formatCode中查找Ms,Ds和Ys,但这似乎有问题。

有没有人对这个问题有好运?似乎目前缺乏xlsx支持的标准Excel阅读库。我已经阅读了标准并且已经挖掘了很多xlsx文件而没有太多运气。

最好的信息似乎来自这个stackoverflow问题:

what indicates an office open xml cell contains a date time value

谢谢!

2 个答案:

答案 0 :(得分:4)

  

日期存储为整数

在Excel数据模型中,实际上没有整数这样的东西。一切都是浮动的。日期和日期时间是浮点数,表示自变量纪元以来的天数和分数。时间是一天的一小部分。

  

似乎标准优秀   xlsx缺少阅读库   支持此时。

谷歌( “xlsxrd”)。要及时了解最新信息,请加入the python-excel group

修改我看到您有already asked a question there。如果您曾在此处提出具体问题,或者回复了我的澄清请求,那么您将在两周前获得此信息。

查看xlrd文档。在前面有一个关于Excel日期的讨论。所有这些都适用于Excel 2007以及早期版本。特别是:有必要解析自定义格式。有必要有一个“标准”格式索引表,用于日期格式。某些地方列出的“标准”格式不包括CJK语言环境中使用的格式。

您的选择:

(1)借用xlrd源代码,包括xldate_as_tuple函数。

(2)选项(1)+获取xlsxrd螺栓套件并借用其源代码。

(3)[推荐]获取xlsxrd bolt-on工具包并使用它......您将获得一组API,这些API可以在Excel版本2.0到2007和Python版本2.1到2.7之间运行。

答案 1 :(得分:0)

仅仅以数字格式代码

查找Ms,Ds和Ys是不够的
[Red]#,##0 ;[Yellow](#,##0)

是完全有效的数字格式,包含Y和D,但不是日期格式。我专门测试方括号之外的任何标准日期/时间格式字符('y','m','d','H','i','s')('[''] “)。 即使在那时,我发现一些误报正在下滑,主要与会计和货币格式有关。因为这些通常以下划线('_')或空格后跟零('0')开头(我都没有遇到日期格式,我明确地过滤掉这些值。

我的(PHP)代码的一部分,用于确定格式掩码是否为日期:

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;

我确信我可能仍然会有例外情况,但是(如果是的话)可能是极端情况