Изменения в CTP-версии пакета SDK Open XML версии 2 (апрель 2009 г.)

Одно из важных изменений, внесенных в CTP-версию пакета SDK Open XML версии 2 (апрель 2009 г.), заключается в улучшении компонента DOM-модели низкого уровня с целью включения функций, связанных с пакетом обновления 2 (SP2) системы Office 2007. Эта модернизация изменила способ интерпретации некоторых элементов как свойств 1-го класса родительского класса/элемента по отношению к дочернему. Например, SdtProperties теперь не является свойством классов SdtXXX, а интерпретируется как дочерний элемент. Просматривая различные каналы связи с пользователями, сообщения на форуме по Open XML SDK, www.openxmldeveloper.org, а также сайт SDK Connect, я заметил, что это изменение противоречит некоторым из моих предыдущих записей и примеров кода. В сегодняшней записи я продемонстрирую применение обходного решения этой проблемы и приведу примеры того, как исправить неработающий в настоящее время код и сделать его совместимым с апрельской CTP-версией пакета SDK.

SdtBlock не содержит определение для свойств SdtProperties

Во многих моих записях о пакете SDK, касающихся программы Word, элементы управления содержимым рассматриваются как семантическая структура. В своих записях я демонстрирую использование элементов управления содержимым для быстрого поиска содержимого или добавления его в конкретные области. Во многих сообщениях используется следующая конструкция фрагмента кода:

SdtBlock sdt = mainPart.Document.Descendants<SdtBlock>()

.Where(s => s.SdtProperties.GetFirstChild<Alias>().Val.Value

.Equals(sdtName)).First();

Если попытаться скомпилировать приведенный выше фрагмент кода в последней CTP-версии пакета SDK, возникнет следующая ошибка компилятора:

'DocumentFormat.OpenXml.Wordprocessing.SdtBlock' does not contain a definition for 'SdtProperties' and no extension method 'SdtProperties' accepting a first argument of type 'DocumentFormat.OpenXml.Wordprocessing.SdtBlock' could be found (are you missing a using directive or an assembly reference?)

Для устранения этой ошибки необходимо получить доступ к SdtProperties как дочернему элементу, а не свойству. Это можно выполнить, используя следующий фрагмент кода:

SdtBlock sdt = mainPart.Document.Descendants<SdtBlock>()

.Where(s =>

s.GetFirstChild<SdtProperties>().GetFirstChild<Alias>().Val.Value

.Equals(sdtName)).First();

SdtBlock не содержит определение для SdtContentBlock

Аналогично случаю с SdtProperties SdtContentBlock перемещен в дочерние элементы и не является больше свойством. Необходимо изменить следующий фрагмент кода:

Paragraph p = sdt.SdtContentBlock.GetFirstChild<Paragraph>();

чтобы он выглядел так:

Paragraph p = sdt.GetFirstChild<SdtContentBlock>().GetFirstChild<Paragraph>();

Ссылки на примеры исправленных версий кода или решений

Ниже приведены ссылки на исправленные версии прежних решений, функциональность которых была нарушена вследствие внесения изменений в апрельской CTP-версии 2009 года.

Решение

Ссылка на пример исправленного кода

Импорт таблиц из Word в Excel

Щелкните здесь

Импорт диаграмм из Excel в Word

Щелкните здесь

Отзывы

В настоящее время мы ищем пути улучшения поведения пакета SDK и возвращения в него некоторых их утраченных функций, в частности связанных с тем, что некоторые элементы не рассматриваются, как свойства 1го класса. Следите за обновлениями.

Хочу воспользоваться случаем и поблагодарить вас за отзывы. Оставайтесь на связи.

Спасибо.

Зияд Раджаби (Zeyad Rajabi)

Это локализованная запись блога. Исходную статью можно найти по адресу https://blogs.msdn.com/brian_jones/archive/2009/05/19/breaking-changes-in-the-open-xml-sdk-v2-april-2009-ctp.aspx.