Как создать образцы SpreasheetML для всех трех параметров совместимости дат из Excel 2010? - PullRequest
2 голосов
/ 22 января 2011

Согласно ECMA-376, второе издание, часть 1. Справочник по основам и языку разметки SpreadsheetML поддерживает последовательные значения даты с тремя возможными настройками совместимости и различными диапазонами.

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

  • В системе дат 1900 года нижний предел составляет 1 января -9999, который имеет серийное значение -4346018. Базовая дата для этой базовой системы дат - 30 декабря 1899 года, серийное значение которой равно 0.
  • В системе дат обратной совместимости 1900 года нижний предел составляет 1 января 1900 года, что имеет серийный номер 1. Базовая дата для этой базовой системы дат - 31 декабря 1899 г., которая имеет серийный номер. значение 0.
  • В системе дат обратной совместимости 1904 г. нижний предел составляет 1 января 1904 г. имеет серийное значение 0. Базовая дата для этой базовой системы дат - 1 января 1904 г., которая имеет серийное значение. 0.

Тем не менее, когда я использую Microsoft Office Excel 2010 для создания файла * .xlsx с порядковым номером 1, в файле * .xlsx не будет установлен ни один атрибут dateCompatibility (что означает «система баз данных 1900 года»), но дата, связанная с серийным номером 1, - 1 января 1900 года (что означает «обратная совместимость 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 Ответ

3 голосов
/ 22 января 2011

Реализация по умолчанию в 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

...