2

我正在使用一些通过解析 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,但这似乎有问题。

有人遇到过这个问题吗?目前似乎标准的 excel 阅读库缺乏对 xlsx 的支持。我已经通读了这些标准,并且在没有太多运气的情况下挖掘了很多 xlsx 文件。

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

什么表明 office open xml 单元格包含日期时间值

谢谢!

4

2 回答 2

5

日期存储为整数

在 Excel 数据模型中,真的没有整数这种东西。一切都是浮云。日期和日期时间是浮点数,表示自可变时期以来的天数和分数。时间是一天的一小部分。

目前似乎标准的 excel 阅读库缺乏对 xlsx 的支持。

谷歌(“xlsxrd”)。要保持最新状态,请加入python-excel 组

编辑我看到你已经在那里问了一个问题。如果你在那里问了一个和这个一样具体的问题,或者回复了我的澄清请求,你会在两周前得到这个信息。

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

适合您的选项:

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

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

(3) [推荐] 获取xlsxrdbolt-on kit并使用它...您将获得一组跨Excel版本2.0到2007和Python版本2.1到2.7运行的API。

于 2011-02-09T21:14:03.083 回答
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;

我确信可能仍然有我遗漏的例外情况,但是(如果是这样的话)它们可能是极端情况

于 2011-02-10T09:07:03.360 回答