2011-01-22 19 views
2

根據ECMA-376,第二版,第1部分 - 基礎和標記語言參考 SpreadsheetML支持具有三種可能的兼容性設置和各種範圍的日期序列值。如何爲Excel 2010中的所有三個日期兼容性設置生成SpreasheetML示例?

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實際使用後向兼容的系統日期儘管上workbookPr不存在dateCompatibility屬性。

該工作簿的選項僅顯示1904年日期系統的未選中複選框。我沒有看到1900年的日期和1900年的向後兼容性。

我讀的規格錯了嗎?或SpreadsheetML?或者是其他東西?

回答

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

+0

感謝。現在您已經提到過了,我發現默認值是針對規範中其他地方的「向後兼容」模式。我還注意到它將1900年編纂爲「向後兼容」的閏年。在我的翻譯代碼中愛這個小分支。 :-)'if(dateCompatibility == DateCompatibility.BackwardsCompatibleBase1900 && dateSerial> = 61.0){dateSerial - = 1; }' –

+0

是的,作爲閏年的1900年實際上是早期版本的Lotus 1-2-3的倒退;當Excel需要兼容性 –