Microsoft Office 2007 Open XML
Часть 2
Переход на Open XML Format: утилиты
Microsoft Office Compatibility Pack
Office Migration Planning Manager
Microsoft SDK for Open XML Formats
В прошлом году мы рассказали о новом XML-формате, используемом для хранения документов в Microsoft Office 2007 (см. ст. «Office 2007 Open XML Format» в КомпьютерПресс № 6’2006 и «Коротко об OpenXML» в КомпьютерПресс № 7’2007). Были рассмотрены его основные характеристики, формат файлов, а также программные интерфейсы для работы с офисными файлами в новом формате. В данной части речь пойдет о некоторых изменениях и обновлениях, связанных с форматом Office Open XML.
Стандартизация формата
Наиболее значимой новостью является то, что Office Open XML — спецификация файлового формата для хранения электронных документов — в декабре прошлого года была стандартизована европейским комитетом по стандартизации Ecma International (стандарт Ecma 376) и в настоящий момент Office Open XML проходит процесс стандартизации в международных организациях ISO и IEC.
На рис. 1 показаны спецификации Office Open XML, включенные в состав стандарта Ecma 376.
Рис. 1. Спецификации Office Open XML, включенные в состав стандарта Ecma 376
К стандартизованным спецификациям относятся описания форматов электронных документов — WordprocessingML, электронных таблиц — SpreadsheetML, презентаций — PresentationML, а также различных компонентов электронных документов: графики — DrawingML, расширений XML — Custom XML, библиографической информации, VML, метаданных и формул. Помимо этого стандарт Ecma 376 описывает взаимодействие различных частей документов на уровне Open Packaging Convention, определяя правила создания ссылок, описания типов частей документов и способы задания цифровых подписей.
Таким образом, стандартизация формата Office Open XML и использование для его реализации кроссплатформенных технологий (XML, ZIP, Unicode) делают этот формат максимально привлекательным для хранения электронных документов и обмена ими между приложениями — как реализованными с помощью различных технологий, так и работающими на разных платформах.
В табл. 1 показана поддержка ключевых технологий на популярных платформах.
Таблица 1. Поддержка ключевых технологий OpenXML на популярных платформах
Технологии |
Linux |
Java |
Microsoft .NET |
COM |
ZIP Library |
Minizip zLib |
J2SE java.util.zip |
.NET Framework 3.0 System.IO.Packaging, Xceed .NET controls |
Xceed ActiveX controls |
XML Library |
Apache Xerces |
JAXP |
.NET Framework 3.0 System.Xml |
MSXML |
Отметим, что включенное в .NET Framework 3.0 пространство имен System.IO.Packaging также поддерживает основные концепции Open Packaging Convention.
Стандарт Ecma 376 состоит из пяти больших модулей (суммарно — более 600 страниц): Fundamentals, Open Packaging Conventions, Primer, Markup Language Reference и Markup Compatibility and Extensibility. Знакомство со стандартом следует начинать с модуля Fundamentals, затем перейти к модулю Primer, а остальные модули использовать в качестве справочников. Наиболее полная версия стандарта доступна на сайте Ecma по адресу: http://www.ecma-international.org/publications/standards/Ecma-376.htm.
Напомним, что все вопросы, связанные с форматом Office Open XML, рассматриваются на сайте OpenXML Developer (http://openxmldeveloper.org/), созданном при поддержке более 40 компаний (рис. 2).
Рис. 2. Сайт OpenXML Developer
Переход на Open XML Format: утилиты
Второй новинкой Microsoft Office 2007 является выпуск нескольких утилит, существенно облегчающих переход на новый формат хранения офисных документов.
Microsoft Office Compatibility Pack
Набор конверторов, входящих в состав Microsoft Office Compatibility Pack, позволяет пользователям Office XP, Office 2002 и Office 2003 открывать и редактировать файлы, сохраненные в новом формате, а также сохранять файлы в формате Office 2007. Microsoft Office Compatibility Pack — это бесплатный набор утилит, который можно загрузить по адресу: http://go.microsoft.com/fwlink?LinkID=77512.
Office Migration Planning Manager
Office Migration Planning Manager призван помочь организациям подготовиться к миграции на Microsoft 2007 Office System. В его состав входят следующие утилиты:
- OMPM File Scanner (offscan.exe) — утилита командной строки, проверяющая документы на предмет совместимости с новым форматом. Результаты сканирования документов размещаются в XML-файле, который может быть затем проанализирован автоматически или вручную. OMPM File Scanner выполняет два типа проверок:
- простое сканирование — выполняется идентификация документов Office на компьютере пользователя или в сетевой файловой системе (маршрут сканирования задается в конфигурационном файле offscan.ini), при этом собирается информация о полном имени файла, его размере, формате, дате создания, дате модификации и владельце,
- полноценное сканирование — выполняется сканирование свойств документов с целью обнаружения потенциальных проблем при конвертации документов в новый формат;
• набор утилит, автоматизирующих создание новой базы данных (поддерживается SQL Server 2000, SQL Server 2005 или SQL Express) и импорт данных из XML-файлов, созданных утилитой OMPM File Scanner. Использование SQL Server 2005 рекомендуется для работы с большими архивами файлов — более 100 тыс. офисных документов. Утилиты реализованы в виде пакетных файлов — CreateDB.bat и DeleteDB.bat. Утилита для импорта данных — ImportScans.bat — базируется на технологии SQLXML 3.0 и позволяет обрабатывать файлы протоколов большого объема: обработка файла размером 10 Кбайт и импорт данных из него занимает порядка 5 мин;
- средство создания отчетов на основе Microsoft Access 2007, с помощью которого можно анализировать результаты сканирования и задавать наборы файлов для автоматического преобразования в новый формат, используя утилиту Office File Converter;
- Office File Converter (OFC) — утилита для массового преобразования файлов в новый формат Office 2007;
- Version Extraction Tool (VET) — средство извлечения версий файлов.
Взаимодействие OMPM-компонентов показано на рис. 3.
Рис. 3. Взаимодействие OMPM-компонентов
OMPM File Scanner выполняет сканирование файлов Office, приведенных в табл. 2.
Таблица 2. Форматы файлов, поддерживаемые OMPM File Scanner
Приложение Microsoft Office |
Полноценное сканирование |
Только простое сканирование |
Access |
*.mdb, *.mde, *.mdz, *.adp, *.ade, *.mdt, *.mda, *.accda, *.accdb, *.accdr, *.accdu, *.accde, *.accdt, *.accdc |
|
Excel |
*.xls, *.xlt, *.xla, *.xlm, *.xlw, *.htm, *.html, *.mhtml, *.mht |
*.xlc, *.wk1, *.wk3, *.wk4, *.wj1, *.wj2, *.wj3, *.fj3, *.fmt, *.fm3, *.all, *.wks, *.wq1, *.dbf |
PowerPoint |
*.ppt, *.pot, *.pps, *.ppa |
|
Project |
*.mpp, *.mpt |
|
Publisher |
*.pub |
|
Visio |
*.vsd, *.vss, *.vst, *.vdx, *.vtx, *.vsx |
|
Word |
*.doc, *.dot, *.wiz |
|
Отметим, что сканирование файлов Microsoft Office Outlook, Microsoft Office FrontPage, Microsoft Office OneNote и Microsoft Office InfoPath не производится.
Как видите, использование утилит, входящих в состав Office Migration Planning Manager, позволит компаниям, накопившим значительное количество документов в формате Office, безболезненно перейти на новый формат файлов и воспользоваться всеми преимуществами хранения документов в формате Open XML. Office Migration Planning Manager можно загрузить по адресу: http://go.microsoft.com/fwlink?linkid=75727.
Microsoft SDK for Open XML Formats
И наконец, третья новинка — это выпущенная в июне этого года библиотека классов для работы с офисными документами в формате Open XML. Она представляет собой программную объектную модель, построенную поверх пространства имен System.IO.Packaging и предоставляющую в распоряжение разработчиков строго типизированные классы для работы с документами, созданными средствами Microsoft Office Word 2007, Microsoft Office Excel 2007 и Microsoft Office PowerPoint 2007. Эти классы расположены в пространстве имен Microsoft.Office.DocumentFormat.OpenXml и должны быть подключены к проекту Microsoft Visual Studio 2005 с помощью команды Add Reference.
Основное отличие классов, реализованных в пространстве имен Microsoft.Office. DocumentFormat.OpenXml, от классов из пространства имен System.IO.Packaging заключается в том, что первые рассчитаны на работу с документами, создаваемыми средствами Microsoft Office 2007, тогда как последние предоставляют более абстрактный способ решения тех же задач.
В рассматриваемом нами пространстве имен — Microsoft.Office.DocumentFormat. OpenXml — реализована иерархия, отражающая основную структуру офисных документов (рис. 4).
Рис. 4. Фрагмент иерархии классов
в пространстве имен Microsoft.Office.DocumentFormat.OpenXml
На вершине иерархии классов располагается класс OpenXMLPartContainer, представляющий собой контейнер для частей офисного документа. От него наследуют два класса — OpenXmlPackage и OpenXmlPart.
Класс OpenXmlPackage служит базовым классом для реализации классов, описывающих три типа офисных документов: WordprocessingDocument (созданный средствами Microsoft Word), SpreadsheetDocument (созданный средствами Microsoft Excel) и PresentationDocument (созданный средствами Microsoft PowerPoint). Базовый класс содержит ряд свойств и методов, разделяемых всеми унаследованными от него классами. К основным свойствам класса OpenXmlPackage относятся свойства, показанные в табл. 3.
Таблица 3. Свойства класса OpenXmlPackage
Свойство |
Описание |
CompressionOption |
Задает или возвращает уровень сжатия части документа |
ExternalRelationships |
Возвращает внешние ссылки на документ |
Package |
Возвращает объект Package для данного документа |
PackageProperties |
Возвращает свойства объекта Package |
PartExtensionProvider |
Возвращает объект PartExtensionProvider, который содержит отражение типа части документа на его расширение |
Parts |
Возвращает все части документа, связанные с данной частью |
Методы класса OpenXmlPackage позволяют манипулировать частями документа и взаимоотношениями между ними (табл. 4).
Таблица 4. Основные методы класса OpenXmlPackage
Метод |
Описание |
AddExtendedPart |
Добавляет расширенную часть документа |
AddExternalRelationship |
Добавляет внешнюю ссылку |
AddPart |
Добавляет часть документа |
Close |
Сохраняет и закрывает пакет, а также все потоки, связанные с частями документа |
DeleteExternalRelationship |
Удаляет внешнюю ссылку |
DeletePart |
Удаляет часть документа |
DeleteParts |
Удаляет части документа, входящие в указанную коллекцию |
DeletePartsRecursivelyOfType |
Рекурсивно удаляет части документа указанного типа |
Dispose |
Сохраняет содержимое, закрывает документ и освобождает все ресурсы |
GetIdOfPart |
Возвращает идентификатор части документа |
GetPartById |
Возвращает часть документа по заданному идентификатору |
GetPartsCountOfType |
Возвращает число частей указанного типа в документе |
GetPartsOfType |
Возвращает коллекцию частей указанного типа |
Validate |
Проверяет содержимое пакета, но не его отдельных XML-частей |
Построенные на основе класса OpenXmlPackage классы, реализующие конкретные типы документов, добавляют ряд свойств и методов, уникальных для их структуры. Например, класс WordprocessingDocument — это документ, созданный средствами Microsoft Word и содержащий свойство MainDocumentPart, которое возвращает «корневую» часть документа; класс SpreadsheetDocument, представляющий собой электронную таблицу, созданную средствами Microsoft Excel, содержит свойство WorkbookPart, а класс PresentationDocument, реализующий презентацию, созданную средствами Microsoft PowerPoint, — свойство PresentationPart.
Для создания документов различных типов существуют перегруженные методы Create — они позволяют создавать новый экземпляр соответствующего класса на основе указанного пакета, файлового потока или файла. Пример вариантов метода Create для класса WordprocessingDocument показан в табл. 5.
Таблица 5. Пример вариантов метода Create для класса WordprocessingDocument
Метод |
Описание |
Create (Package, WordprocessingDocumentType) |
Создает новый экземпляр класа WordprocessingDocument на основе указанного пакета |
Create (Stream, WordprocessingDocumentType) |
Создает новый экземпляр класа WordprocessingDocument на основе файлового потока |
Create (String, WordprocessingDocumentType) |
Создает новый экземпляр класа WordprocessingDocument на основе указанного файла |
Для открытия файла также предусмотрены перегруженные методы Open — для работы на уровне пакетов, файловых потоков или файлов. Соответствующие методы Add — AddMainDocumentPart, AddWorkbookPart и AddPresentationPart — позволяют добавлять к документу новые части.
Части документа построены на основе класса OpenXmlPart и унаследованных от него MainDocumentPart, WorkbookPart, PresentationPart и множества других (включая ImagePart, CommentsPart, PivotTablePart, WorksheetPart, SlidePart, ThemePart, CustomXmlPart и т.п.), отвечающих за отдельные части документа того или иного типа. Базовый класс содержит ряд свойств и методов, разделяемых всеми унаследованными от него классами. Основные свойства класса OpenXmlPart перечислены в табл. 6.
Таблица 6. Основные свойства класса OpenXmlPart
Свойство |
Описание |
ContentType |
Содержит MIME-тип для данной части документа |
ExternalRelationships |
Возвращает внешние ссылки на документ |
OpenXmlPackage |
Возвращает OpenXmlPackage, содержащий данную часть документа |
Parts |
Возвращает перечисление всех частей, связанных с данной |
RelationshipType |
Возвращает тип связи для данной части |
Uri |
Возвращает внутренний адрес части внутри пакета |
Методы класса OpenXmlPart позволяют манипулировать частями документа и взаимоотношениями между ними (табл. 7).
Таблица 7. Основные методы класса OpenXmlPart
Метод |
Описание |
AddExtendedPart |
Добавляет расширенную часть документа |
AddExternalRelationship |
Добавляет внешнюю ссылку |
AddNewPart |
Добавляет новую часть документа |
AddPart |
Добавляет часть документа |
DeleteExternalRelationship |
Удаляет внешнюю ссылку |
DeletePart |
Удаляет часть |
DeleteParts |
Удаляет части, находящиеся в указанной коллекции |
FeedData |
Передает данные в поток |
GetIdOfPart |
Возвращает идентификатор части документа |
GetParentParts |
Возвращает «родительские» части документа |
GetPartById |
Возвращает часть документа по заданному идентификатору |
GetPartsCountOfType |
Возвращает число частей указанного типа в документе |
GetPartsOfType |
Возвращает коллекцию частей указанного типа |
GetStream |
Возвращает поток, связанный с частью документа |
ValidateXml |
Проверяет содержимое части документа на соответствие указанной схеме |
После того как мы ознакомились с основами организации библиотеки классов для работы с офисными документами в формате Open XML, рассмотрим несколько примеров ее применения.
Начнем с примера, показывающего, как использовать данную библиотеку для создания нового документа в формате Microsoft Word. Первый шаг — это создание пакета типа WordprocessingDocument:
WordprocessingDocument wordDoc
wordDoc = WordprocessingDocument.Create (“c:\OpennXMLDemo.docx”, WordprocessingDocumentType. Document);
После этого мы задаем наполнение документа — создаем его основную часть:
using (wordDoc)
{
MainDocumentPart mainPart = wordDoc. AddMainDocumentPart();
и заполняем ее данными:
const string docXml =
@”<?xml version=””1.0"” encoding=””UTF-8"” standalone=””yes””?> <w:document xmlns:w=””http://schemas.openxmlformats.org/wordprocessingml/2006/main””>
<w:body><w:p><w:r><w:t>Hello world!</w:t></w:r></w:p></w:body>
</w:document>”;
using (Stream stream = part.GetStream())
{
byte[] buf = (new UTF8Encoding()). GetBytes(docXml);
stream.Write(buf, 0, buf.Length);
}
}
Для того чтобы добавить к документу новую часть, можно воспользоваться следующей процедурой, которой в качестве параметров передаются имя документа и файловый путь:
public static void AddNewPart(string document, string fileName)
{
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
CustomXmlPart myXmlPart = mainPart.AddNewPart <CustomXmlPart>();
using (FileStream stream = new FileStream(fileName, FileMode.Open))
{
myXmlPart.FeedData(stream);
}
}
}
Сначала мы открываем документ, используя соответствущий метод Open, затем получаем доступ к его основной части (MainDocumentPart). После этого мы создаем новую часть документа, открываем документ в режиме записи и заносим новую часть в документ. Для того чтобы добавленная часть могла применяться в документе, ее необходимо занести в таблицу связей частей документа.
Для получения содержимого определенной части документа (например, комментариев в текстовом документе) можно воспользоваться следующей функцией, которой в качестве параметра передается имя документа:
public static string GetCommentsFromDocument(string document)
{
string comments = null;
using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(document, true))
{
MainDocumentPart mainPart = wordDoc.MainDocumentPart;
CommentsPart commentsPart = mainPart.CommentsPart;
using (StreamReader streamReader = new StreamReader(commentsPart.GetStream()))
{
comments = streamReader.ReadToEnd();
}
}
return comments;
}
Сначала мы открываем документ с помощью соответствущего метода Open. Затем мы получаем доступ к его основной части (MainDocumentPart), а после этого — к части документа, в которой хранятся комментарии (CommentsPart). Далее мы создаем поток для полученной части документа и считываем ее содержимое в строковую переменную.
Как видите, использование классов, реализованных в пространстве имен Microsoft.Office.DocumentFormat.OpenXml, позволяет работать с офисными документами более наглядно и в соответствии с объектной моделью и схемой того или иного офисного продукта.
Microsoft SDK for Open XML Formats можно загрузить с сайта Microsoft (раздел Downloads).