现有的API从SpreadsheetML文件中读取date?

Office Open XML SDK中是否有现有的API或第三方从SpreadsheetML / .xlsx文件中正确读取date?

由于存在如此多的variables会影响检测值是date(numFmtId +自定义数字格式),然后将date序列转换为date时间值(标准,向后兼容和1904-超向后兼容的工作簿),所以似乎符合逻辑,这是SDK将提供或至less有人会有一个现有的代码片段来处理。

我正在使用C#,但任何语言的解决scheme将罚款。

看起来没有任何东西已经具体到这个目的。 这是我提出的例程。

/// <summary> /// Represents the formula used for converting date serial values stored within the workbook into DateTime instances. /// </summary> /// <remarks> /// Information on date serial conversion is available here: http://www.documentinteropinitiative.com/implnotes/ISO-IEC29500-2008/001.018.017.004.001.000.000.aspx /// </remarks> public enum XlsxDateCompatibility { /// <summary> /// Standard dates are based on December 30, 1899 and are considered "Standard 1900" dates. /// </summary> StandardBase1900, /// <summary> /// Excel for Windows backwards compatible dates are based on December 31, 1899 are are considered "Backwards compatible 1900" dates. /// </summary> BackwardsCompatibleBase1900, /// <summary> /// Excel for Macintos backwards compatible dates are based on January 1, 1904 and are considered "1904" dates. /// </summary> BackwardsCompatibleBase1904 } private static readonly IDictionary<XlsxDateCompatibility, DateTime> _dateSerialBaseDates = new Dictionary<XlsxDateCompatibility, DateTime> { {XlsxDateCompatibility.StandardBase1900, new DateTime(1899, 12, 30)}, {XlsxDateCompatibility.BackwardsCompatibleBase1900, new DateTime(1899, 12, 31)}, {XlsxDateCompatibility.BackwardsCompatibleBase1904, new DateTime(1904, 1, 1)} }; public static DateTime DateSerialToDateTime(double dateSerial, XlsxDateCompatibility dateCompatibility) { // special case for dateCompaitility 1900, Excel thinks 1900 is a leap year // http://support.microsoft.com/kb/214019 if (dateCompatibility == XlsxDateCompatibility.BackwardsCompatibleBase1900 && dateSerial >= 61.0) { dateSerial -= 1; } DateTime baseDate; if (!_dateSerialBaseDates.TryGetValue(dateCompatibility, out baseDate)) { baseDate = _dateSerialBaseDates[XlsxDateCompatibility.StandardBase1900]; } return baseDate.AddDays(dateSerial); } 

我从来没有读过date,但我想象你将不得不将你正在阅读的单元格的样式索引与x:numFmts元素中的date样式索引进行x:numFmts ,您可以在x:cellStylefind它。 我知道office 2010在单元格上有一个date数据types指示符,所以如果你使用的是这个版本,那么如果这个数据是一个date的话,会更容易。 这是在Office 2010中的样子:

 <x:cr="C4" t="d"> <x:v>1976-11-22T08:30Z</x:v> </x:c> 

将数据转换为DateTime我相信你所要做的只是一个DateTime.FromOADate(cellvalue) ,其中cellValue是一个double。 我知道我们在将date插入到我们的Excel文档之前将DateTime转换为OADate,所以我想用FromOADate方法可以正常工作。

至于任何API来做这些function,我不知道有什么会执行你想要的,但我希望它将包含在SDK的未来版本。