如何为Excel 2010中的所有三个日期兼容性设置生成SpreasheetML样本?

时间:2011-01-22 04:53:57

标签: c# excel openxml openxml-sdk spreadsheetml

根据 ECMA-376,第二版,第1部分 - 基础知识和标记语言参考 SpreadsheetML支持具有三种可能的兼容性设置和各种范围的日期序列值。

http://www.documentinteropinitiative.com/implnotes/ISO-IEC29500-2008/001.018.017.004.001.000.000.aspx

  
      
  • 在1900年日期基准系统中,下限为1月1日-9999,其序列值为-4346018。此日期基准系统的基准日期是1899年12月30日,其序列值为0.
  •   
  • 在1900年的向后兼容日期 - 基础系统中,下限是1900年1月1日   具有序列值1.此日期基本系统的基准日期是1899年12月31日,其具有序列号   值为0.
  •   
  • 在1904年的向后兼容日期 - 基础系统中,下限是1904年1月1日   序列值为0.此日期基础系统的基准日期是1904年1月1日,具有序列值   0。
  •   

但是,当我使用Microsoft Office Excel 2010生成日期序列为1的* .xlsx文件时,* .xlsx文件没有设置任何dateCompatibility属性(表示“1900日期基本系统”) )但与日期序列1相关的日期是1900年1月1日(表示“1900向后兼容性”)。

workbookPr元素是未经编辑的,没有dateCompatibility属性。

<x:workbookPr defaultThemeVersion="124226" xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main" />

这是一行显示日期序列为1的数据,以及将其格式化为日期的文本结果:

   <x:row r="3" spans="1:2">
     <x:c r="A3">
       <x:v>1</x:v>
     </x:c>
     <x:c r="B3" t="str">
       <x:f t="shared" si="0" />
       <x:v>1900-01-01 00:00:00.0</x:v>
     </x:c>
   </x:row>

公式只是日期格式,在前面的工作表中引用:

    <x:f t="shared" ref="B1:B42" si="0">TEXT(A1, "yyyy-mm-dd HH:mm:ss.0")</x:f>

此公式与将日期格式模式应用于日期序列号的结果相同,如下面的屏幕截图所示。

alt text

同样格式化否定日期会导致错误,这是Excel实际使用向后兼容日期系统的另一个指示,尽管dateCompatibility上没有workbookPr属性。

工作簿的选项仅显示1904日期系统的未选中复选框。我没有看到1900年基于日期和1900向后兼容性的任何选项。

我读错了规格吗?还是SpreadsheetML?或其他什么?

1 个答案:

答案 0 :(得分:3)

Excel中的默认实现是dateCompatibility="1"(即1900向后兼容性),因此如果不存在,它仍然是dateCompatibility="1"。请注意,Excel并未完全实现SpreadsheetML(因为Word和PowerPoint也没有完全实现其各自的ML,并且使用2010客户端版本,以标准不支持的方式扩展ML)。在将串行值转换为日期值时,似乎没有实现(非常好)1和3。

ECMA对此进行了一些推迟以及date1904的使用,请参阅:http://xmlguru.cz/2008/01/ecma-response-to-czech-ooxml-comments并搜索 dateCompatibility