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

发布于 2024-10-13 01:09:01 字数 1926 浏览 7 评论 0原文

根据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 实际上使用向后兼容日期系统的另一个指标,尽管不存在workbookPr 上的 dateCompatibility 属性。

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

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

According to the ECMA-376, Second Edition, Part 1 - Fundamentals And Markup Language Reference SpreadsheetML supports date serial values with three possible compatibility settings and various ranges.

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

  • In the 1900 date base system, the lower limit is January 1, -9999, which has serial value -4346018. The base date for this date base system is December 30, 1899, which has a serial value of 0.
  • In the 1900 backward compatibility date-base system, the lower limit is January 1, 1900, which
    has serial value 1. The base date for this date base system is December 31, 1899, which has a serial
    value of 0.
  • In the 1904 backward compatibility date-base system, the lower limit is January 1, 1904, which
    has serial value 0. The base date for this date base system is January 1, 1904, which has a serial value
    of 0.

However, when I use Microsoft Office Excel 2010 to generate a *.xlsx file with a date serial of 1, the *.xlsx file does not have any dateCompatibility attribute set (indicating "1900 date base system") but the date associated with date serial 1 is January 1, 1900 (indicating "1900 backward compatibility").

The workbookPr element is this, unedited, no dateCompatibility attribute.

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

And here is a row of data that shows a date serial of 1 and the text result of formatting it as a date:

   <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>

the formula is just date formatting, referenced earlier in the worksheet:

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

This formula gives the same result as applying a date format pattern to the date serial number, demonstrated in the below screen shot.

alt text

Also formatting negative dates results in an error, another indicator that Excel is actually using backwards-compatible date system despite the absence of the dateCompatibility attribute on workbookPr.

The options for the workbook only show an unchecked checkbox for 1904 date system. I don't see any option for 1900 date based vs. 1900 backwards-compatibility.

Am I reading the spec wrong? Or the SpreadsheetML? Or something else?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

天气好吗我好吗 2024-10-20 01:09:01

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

The default implementation in Excel is dateCompatibility="1" (i.e. 1900 backward compatibility), so if it is absent, it is still dateCompatibility="1". Note that Excel doesn't fully implement SpreadsheetML (as Word and PowerPoint also do not fully implement their respective MLs and with 2010 client versions, extend the ML in ways not supported by the standard(s)). 1 and 3 don't appear to be implemented (very well) in conversion of serial values to date values.

There's been some push-back to ECMA on this and the use of date1904, see: http://xmlguru.cz/2008/01/ecma-response-to-czech-ooxml-comments and search on dateCompatibility

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文