Office 2007 Open XML Format

Алексей Федоров

Коротко о главном

Общий обзор формата Office 2007 Open XML Format

   Контейнер

   Части документа

   Реляционные элементы

   Типизованные элементы

   Встроенные объекты

Детали реализации

Программные интерфейсы

Сценарии использования документов в XML-формате

Коротко о главном

Одной из новинок Microsoft Office 2007 станет поддержка нового формата хранения документов на базе языка XML. Этот формат будет поддерживаться в программных продуктах Microsoft Word 2007, Microsoft Excel 2007 и Microsoft PowerPoint 2007. В данном обзоре мы рассмотрим основные характеристики Office 2007 Open XML Format, обсудим формат файлов, а также программные интерфейсы для работы с офисными файлами в новом формате.

Поддержка языка XML не является эксклюзивом пакета Microsoft Office — первые варианты такой поддержки появились в 1999 году в Office 2000, когда были представлены XML-форматы для Word (WordprocessingML) и Excel (SpreadSheetML). В версии Office 2007 появился формат PresentationML для PowerPoint, а форматом сохранения документов по умолчанию стал ZIP-контейнер, соответствующий спецификации Open Packaging Conventions (подмножество Office 2007 Open XML Format) и пришедшей на смену бинарным форматам хранения документов, электронных таблиц и презентаций, использовавшихся в предыдущих версиях Office.

В таблице приведен список используемых в Microsoft Office 2007 расширений файлов, в которых хранятся документы в формате Office 2007 Open XML Format.

 

Microsoft планирует выпуск соответствующих обновлений для предыдущих версий Office, начиная с Office 2000 — для того, чтобы эти продукты могли полноценно работать с новым форматом хранения документов, создаваемых в Word, Excel и PowerPoint.

Общий обзор формата Office 2007 Open XML Format

Начнем обсуждение Office 2007 Open XML Format с рассмотрения общих характеристик этого формата. Затем в следующем разделе мы обратимся к более подробному рассмотрению деталей сохранения документов, создаваемых такими приложениями Microsoft Office 2007, как Word 2007, Excel 2007 и PowerPoint 2007.

Контейнер

XML-формат, используемый в Microsoft Office 2007, представляет собой ZIP-архив — контейнер, который называется package и в котором помещаются различные компоненты документа, называемые частями (part) и элементами (item). Части являются фрагментами документа и отвечают за его содержимое, элементы представляют собой метаданные, описывающие то, каким образом части должны быть собраны вместе и отображены. Элементы можно разделить на два типа: реляционные (relationship items), описывающие взаимоотношения между частями и типизованные (content-type items), задача которых — дать описание содержимого каждой части документа. Реляционные элементы, в свою очередь, подразделяются на элементы, описывающие взаимоотношения контейнеров, и элементы, задающие взаимоотношения между частями документа.

Части документа

Каждый документ содержит так называемую главную часть — все остальные элементы либо располагаются внутри этой главной части, либо так или иначе привязаны к ней. В зависимости от типа файла (текстовый документ, электронная таблица, презентация) главная часть может называться по-разному. Например:

 

Не все части документа сохраняются в XML-формате. Например, графические изображения (*.png, *.jpg, *.tiff) хранятся в оригинальном формате, что делает более удобным доступ к ним и выполнение соответствующих манипуляций. Помимо этого в бинарном виде хранятся VBA-проекты и внедренные в документы OLE-объекты. Части документа, сохраняемые в XML-формате, соответствуют схемам, определенным для того или иного фрагмента документа.

Реляционные элементы

Как мы увидели выше, для каждого типа документа главная часть располагается в соответствующей папке контейнера и имеет собственное название. Реляционный элемент с именем officeDocument (схема http://schemas.microsoft.com/office/2006/relationships/officeDocument) позволяет обнаружить главную часть любого документа — он хранится в файле с расширением *.rels в папке _rels. Файл *.rels содержит описание взаимоотношений фрагментов документа в следующем формате:

<Relationship Id=”relId” Type=”relationshipType”, Target = “target Part” />

где:

http://schemas.microsoft.com/office/2006/relationships/officeDocument

http://schemas.microsoft.com/office/2006/relationships/image

http://schemas.microsoft.com/office/2006/relationships/sound

http://schemas.microsoft.com/office/2006/relationships/oleObject

http://schemas.microsoft.com/office/2006/relationships/activeXControl

http://schemas.microsoft.com/office/2006/relationships/diagram

...

Папка _rels имеет ключевое значение для всего процесса сохранения офисных документов в формате XML. Взаимоотношения между частями документа всегда задаются именно в этой папке. Упомянутое выше взаимоотношение officeDocument является взаимоотношением на уровне контейнера — другими словами, оно описывает весь контейнер и потому хранится в папке _rels в корне контейнера. Если же требуется найти описание взаимоотношений между частями документа, то в случае Microsoft Word 2007 его следует искать в файле document.xml — он будет находиться в подкаталоге word каталога _rels. Итеративный просмотр содержимого этого файла позволит вам обнаружить все части документа и взаимоотношения между ними.

Типизованные элементы

Как мы уже отмечали, типизованные элементы содержат метаданные, описывающие файловый тип каждой части документа. К частям документа могут относиться простой текст (text/plain), графическое изображение (image/jpeg) или более абстрактные понятия, например XML-документ (application/xml). Реляционные элементы также имеют соответствующие типизованные элементы, служащие для описания взаимоотношений. Множество типизованных элементов позволяет потребителям XML-файлов получить представление не только о его содержимом, но и о том, как интерпретировать и отрисовывать отдельные части документа.

Типизованные элементы хранятся вместе, в одном элементе с именем [Content_Types].xml в корневой папке контейнера. Типизованный элемент по умолчанию обычно ассоциируется с расширением имени файла, например *.xml или *.jpg. Типизованный элемент override может указывать на то, что данный фрагмент имеет указанный тип независимо от расширения имени файла.

Встроенные объекты

Формат Office Open XML может включать любое число встроенных объектов, которые могут принадлежать к любому типу. Эта возможность, пришедшая на смену неэффективному кодированию Base64, которое использовалось в предыдущих версиях продукта, сделала файлы более гибкими и удобными для обработки.

Например, вставка графического изображения в документ Word 2007 приведет к появлению в контейнере следующих элементов:

После рассмотрения основных характеристик контейнеров и входящих в них элементов хотелось бы более подробно обсудить, как выглядит содержимое файлов, создаваемых в Word 2007, Excel 2007 и PowerPoint 2007.

Детали реализации

В данном разделе мы рассмотрим, как описанный выше XML-формат используется при сохранении документов, создаваемых такими приложениями Microsoft Office 2007, как Word 2007, Excel 2007 и PowerPoint 2007.

Начнем с простого текстового документа, созданного с помощью Word 2007. На рис. 1 показано, как этот документ выглядит в редакторе.

 

Рис. 1. Документ, созданный средствами Word 2007

Сохраненный документ имеет расширение *.docx и представляет собой ZIP-контейнер, который мы можем исследовать с помощью любой программы, позволяющей работать с ZIP-архивами. В качестве примера будем использовать программу WinZip. Ниже показана структура docx-файла, открытого в WinZip (рис. 2).

 

Рис. 2. Структура docx-файла

В файле [Content_Types).xml описаны все типизованные элементы, связанные с данным документом. Все типизованные элементы, уникальные для Word 2007, имеют префикс application/vnd.ms-word. Если типизованный элемент соответствует XML-файлу, то в конец URI добавляется «+xml». Типичными для Word 2007 типизованными элементами являются:

Поскольку имеется возможность изменения имени любого фрагмента документа, в файле [Content_Types).xml описаны и ссылки на такие фрагменты. Например, вот как указывается местоположение таблицы шрифтов:

<Override PartName=”/word/fontTable.xml”

<ContentType=”application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml” />

Взаимоотношения между частями документа всегда располагаются в каталоге _rels. Для конкретного документа взаимоотношения описываются в файле document.xml.rels. Например:

<Relationships xmlns=”http://schemas.openxmlformats.org/package/2006/ relationships”>

<Relationship Id=”rId8"Type=http://schemas.openxmlformats.org/officeDocument/2006/relationships/footerTarget=”footer1.xml”/>

Здесь задается связь между схемой, описывающей нижний колонтитул документа, и файлом footer1.xml, в котором содержится сам колонтитул.

Более подробно прочитать о структуре XML-файла Word 2007 можно в документе «Walkthrough: Office 12 Word Open XML File Format», доступном на сайте MSDN.

Теперь создадим простую электронную таблицу — для этого воспользуемся Excel 2007. На рис. 3 показано, как эта таблица выглядит в Excel 2007.

 

Рис. 3. Таблица, созданная средствами Excel 2007

Откроем файл sample.xlsx в WinZip и посмотрим на его структуру.

Как видно на рис. 4, структура xlsx-файла напоминает структуру docx-файла, но части документа имеют другие имена, отражающие назначение частей электронной таблицы, а не текстового документа. Типичными типизованными элементами для Excel 2007 будут:

 

Рис. 4. Структура xlsx-файла

В папке xl располагаются основные части электронной таблицы — workbook.xml, styles.xml, папка worksheets, папка drawings, папка charts и т.п. Взаимоотношения между частями документа описаны в файле workbook.xml.rels.

Более подробно прочитать о структуре XML-файла Excel 2007 можно в документе «Walkthrough: Office 12 Excel Open XML File Format», доступном на сайте MSDN.

Завершить рассмотрение примеров использования Office 2007 Open XML Format мы хотим простой презентацией, созданной в PowerPoint 2007. Ниже показано, как эта презентация выглядит в PowerPoint 2007 (рис. 5).

 

Рис. 5. Презентация, созданная средствами PowerPoint 2007

Откроем файл sample.pptx в программе WinZip и посмотрим на его структуру (рис. 6).

 

Рис. 6. Структура pptx-файла

Несмотря на то что в pptx-файле содержится значительно больше (по сравнению с docx- и xlsx-файлами) фрагментов, его структура легко узнаваема. Файл presentation.xml описывает всю презентацию, файл presentation.xml.rels — взаимоотношения между частями презентации. Типичными типизованными элементами для PowerPoint 2007 будут:

Каждый слайд описан документом slide.xml, расположенным в каталоге slides. В каталогах theme и slideLayouts находятся xml-документы, описывающие различные шаблоны, применимые к слайдам.

Программные интерфейсы

Для работы с документами, сохраненными в формате Office 2007 Open XML Format, следует использовать классы, реализованные в пространстве имен System.IO.Packaging (библиотека WinFX, сборка windowsbase.dll). Подробное описание данного пространства имен можно получить в онлайновой версии документации к библиотеке WinFX, расположенной по адресу: http://windowssdk.msdn.microsoft.com/library/en-us/cpref12/html/N_System_IO_Packaging.asp.

Рассмотрим несколько примеров. Мы уже отмечали, что для успешной обработки документа в формате Office 2007 Open XML Format необходимо успешно найти главную часть документа, которая имеет тип http://schemas.microsoft.com/office/2006/relationships/officeDocument. Для документов, созданных средствами Word, главная часть хранится в файле document.xml, для электронных таблиц — в файле workbook.xml, а для презентаций — в файле presentation.xml. После того как главная часть документа найдена, мы получаем возможность обнаружить все остальные части документа. В приведенном примере показано, как найти главную часть (documentPart) офисного документа.

//

// Найти «главную часть» документа по заданному имени

файла

,,

public void FindStartPart(string fileName)

{

  string officeDocRelType =

   @”http://schemas.microsoft.com/office/2006/

   relationships/officeDocument”;

   PackagePart documentPart = null;

   Uri documentUri = null;

 

   //Открыть контейнер только для чтения

   using (Package officePackage = Package.

  Open(fileName,

    FileMode.Open, FileAccess.Read))

   {

   // Найти «главную часть»

    foreach (PackageRelationship relationship in

     officePackage.GetRelationshipsByType(office-

     DocRelType))

     {

     // В контейнере только одна «главная часть»

      documentUri = PackUriHelper.ResolvePartUri

      (new Uri(“/”, UriKind.Relative), relationship.

      TargetUri);

     documentPart = officePackage.GetPart(documentUri);

     break;

    }

    // Дальнейшая обработка

  }

}

После того как мы научились извлекать главную часть документа, давайте выясним, каким образом можно найти любую часть документа — для этого необходимо выполнить итерацию по описанию взаимоотношений частей. Ниже показано, как это сделать, на примере поиска комментариев в документе Word.

//

// Найти комментарии в документе

//

string commentsPartRelType =

 @”http://schemas.microsoft.com/office/2006/

   relationships/wordComments”;

PackagePart commentsPart = null;

Stream commentsXML = null;

//

//Итерация по всем взаимоотношениям в document.xml

//

 

foreach (PackageRelationship relationship in

 documentPart.GetRelationshipsByType(comments-

PartRelType))

 {

 //Комментарии = /word/comments.xml

 Uri commentsUri = PackUriHelper.ResolvePartUri

(documentUri,

  relationship.TargetUri);

  commentsPart = officePackage.GetPart(commentsUri);

  break;

 }

В приведенном примере мы использовали URI для нахождения адреса определенного фрагмента документа — это необходимо для того, чтобы не зависеть от имени фрагмента, которое может меняться по мере работы с документом. Последний пример, который мы рассмотрим, относится к удалению определенного фрагмента документа. Предположим, что мы хотим удалить из файла VBA-проект.

public void DeleteVBAPart(string fileName)

{

string officeDocRelType =

 @”http://schemas.microsoft.com/office/2006/

relationships/

 officeDocument”;

const string vbaRelationshipType =

 “http://schemas.microsoft.com/office/2006/

relationships/vbaProject”;

PackagePart documentPart = null;

Uri documentUri = null;

 

//

// Открыть контейнер на чтение

//

 using (Package officePackage = Package.Open

(fileName, FileMode.Open, FileAccess.ReadWrite))

  {

   // Получить «главную часть»

      foreach (PackageRelationship relationship in

        officePackage.GetRelationshipsByType

         (officeDocRelType))

      {

       documentUri = PackUriHelper.ResolvePartUri(new

     Uri(“/”, UriKind.Relative), relationship.

      TargetUri);

       documentPart = officePackage.GetPart(documentUri);

      break;

     }

   // Найти VBA project

     foreach (System.IO.Packaging.PackageRelation-

    ship relationship

     in documentPart.GetRelationshipsByType

    (vbaRelationshipType))

      {

       Uri vbaUri = PackUriHelper.ResolvePartUri

         (documentUri,

        relationship.TargetUri);

      PackagePart vbaPart = officePackage.GetPart

     (vbaUri);

     // Удалить VBA project

            officePackage.DeletePart(vbaUri);

            // Удалить ссылку на VBA

          documentPart.DeleteRelationship

           (relationship.Id);

            break;

      }

 

// Закрыть контейнер

   officePackage.Close();

   }

}

Приведенные примеры помогут вам составить общее представление о том, как использовать классы System.IO.Packaging для работы с документами в формате Office 2007 Open XML Format. В ближайшее время Microsoft планирует опубликовать значительное число примеров использования этого программного интерфейса — следите за новинками на сайте MSDN (http://msdn.microsoft.com).

Сценарии использования документов в XML-формате

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

Более подробную информацию о новых продуктах семейства Microsoft Office 2007 можно получить на сайте MSDN в разделе, посвященном разработке на этой платформе, — http://www.microsoft.com/office/preview/default.mspx.

 

В начало В начало

КомпьютерПресс 6'2006