Как создать образцы SpreasheetML для всех трех параметров совместимости дат из Excel 2010?


Согласно 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 date base system"), но дата, связанная с date serial 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

Также форматирование отрицательных дат приводит к ошибке, еще один показатель того, что Excel фактически использует обратно совместимую систему дат, несмотря на отсутствие dateCompatibility атрибут on workbookPr.

Параметры рабочей книги показывают только непроверенный флажок для системы дат 1904 года. Я не вижу никакого варианта для 1900 даты на основе против 1900 обратной совместимости.

Я неправильно читаю спецификацию? Или SpreadsheetML? Или что-то еще?

1 2

1 ответ:

Реализация по умолчанию в Excel-это dateCompatibility="1" (т. е. обратная совместимость 1900), поэтому, если она отсутствует, она по-прежнему dateCompatibility="1". Обратите внимание, что Excel не полностью реализует SpreadsheetML (так как Word и PowerPoint также не полностью реализуют свои соответствующие MLs и с клиентскими версиями 2010 года расширяют ML способами, не поддерживаемыми стандартом(АМИ)). 1 и 3, по-видимому, не реализованы (очень хорошо) в преобразовании серийных значений в значения даты.

Произошло несколько отказов в ЕСМА по этому и использование date1904, см.: http://xmlguru.cz/2008/01/ecma-response-to-czech-ooxml-comments и поиск по dateCompatibility