Коротко об OpenXML
Одна из любимых задач бизнес-пользователей
Применение OpenXML в бизнес-приложениях
Одна из любимых задач бизнес-пользователей
Вот уже более десятка лет разработчики бизнес-приложений регулярно сталкиваются с задачей генерации документов в форматах, поддерживаемых наиболее популярными офисными приложениями. Подобные задачи ставятся заказчиками проектов по разработке или внедрению информационных систем из-за того, что офисные приложения (в нашей стране это в первую очередь различные версии Microsoft Office), как правило, в той или иной мере знакомы всем бизнес-пользователям, а это существенно упрощает и удешевляет их обучение, обязательно проводимое в процессе внедрения новых решений, а также сопровождение самого решения.
Какие технологии обычно используются разработчиками для генерации подобных документов? Последние десять лет наиболее распространенным способом генерации документов формата Microsoft Office являлась технология COM (Component Object Model) — одна из базовых технологий Windows. Ее применение основано на том, что приложения Microsoft Office, равно как и многие приложения и службы самой операционной системы Windows, реализуют свои прикладные программные интерфейсы в виде COM-интерфейсов, доступных внешним приложениям. Практически все, что может сделать пользователь любого приложения семейства Microsoft Office с помощью меню, клавиатуры и панели инструментов, может быть реализовано в автоматическом режиме, то есть путем манипуляции соответствующим офисным приложением из бизнес-приложения, генерирующего соответствующие документы.
Читатели, интересующиеся деталями применения технологии COM для генерации офисных документов, могут обратиться к публикациям в нашем издании примерно семилетней давности (см., например, цикл статей «Автоматизация приложений Microsoft Office в примерах» в КомпьютерПресс № 11 и 12’2000) — эти материалы по-прежнему доступны на нашем сайте www.compress.ru. В данной же публикации мы не будем вдаваться в многократно обсуждавшиеся технические подробности, а вместо этого обратим внимание на один из недостатков этого подхода, который в конце 90-х годов казался несущественным, но сегодня должен обязательно учитываться.
Представим себе информационную систему, в которой генерация документов формата Microsoft Office должна осуществляться централизованно, а сами документы должны быть предназначены для применения большим количеством пользователей. Подобные требования могут предъявляться к средству генерации, например, еженедельных отчетов для менеджмента на основе корпоративной базы данных либо нормативной документации наподобие должностных инструкций на основании данных, регулярно обновляемых в том или ином средстве управления бизнес-процессами. Наиболее удобно при решении подобных задач осуществлять генерацию документов автоматически по расписанию, без участия пользователя, причем не на рабочей станции, а на сервере. Применение технологии COM в этом случае налагает серьезные ограничения на серверную операционную систему (это обязательно должна быть одна из версий Windows) и вынуждает иметь на сервере установленные офисные приложения. Очевидно, что генерация документов без наличия собственно офисных приложений была бы более удобной, ведь в этом случае серверное приложение не обязано работать под управлением той же платформы, что и офисные приложения. А это, в свою очередь, означает, что для создания подобных решений нужно, чтобы формат данных офисных приложений был документирован.
Форматы некоторых офисных приложений Microsoft были документированы вплоть до 2000 года, однако начиная с Office 2000 компания Microsoft перестала предоставлять доступ к спецификациям этих форматов, потому единственным способом корректной генерации документов Microsoft Office с этого момента и до выхода Office 2007 было применение все той же технологии COM. Однако после выхода Office 2007 данная ситуация изменилась — теперь формат офисных приложений Microsoft стал открытым и документированным. А это означает, что решения, генерирующие офисные документы, можно создавать в отсутствие самих офисных приложений — более того, создавать их на любой платформе.
Что такое OpenXML
Как было отмечено выше, идея открытого формата офисных документов отнюдь не нова. Однако именно в последнее время наметилась тенденция массового перехода офисных приложений к открытым форматам. Так, известный офисный пакет OpenOffice.org поддерживает открытый формат ODF (Open Document Format), спецификация которого является общедоступной, а кроме того, сегодня доступен и инструментарий разработки приложений, работающих с документами в формате ODF, — ODF Toolkit.
Формат OpenXML полностью поддерживает функциональность всех версий Microsoft Office — он позволяет сохранять все особенности документов, созданных с помощью Microsoft Office 2007 и предшествующих версий.
То, что существует техническая возможность создавать и сохранять документы формата OpenXML с помощью приложений, отличных от Microsoft Office 2007, интересно в первую очередь разработчикам бизнес-приложений и системным интеграторам. Что касается пользователей, их должна больше заинтересовать уже реализованная возможность его применения — например чтение и сохранение файлов формата OpenXML может быть осуществлено в рамках трех предыдущих версий Microsoft Office (начиная с Office 2000). Так, при попытке открыть документ этого формата с помощью Office 2003 пользователю будет предложено загрузить соответствующий конвертор (он доступен по адресу: http://www.microsoft.com/downloads/details.aspx?FamilyId=941B3470-3AE9-4AEE-8F43-C6BB74CD1466&displaylang=en), после установки которого чтение и сохранение документов формата OpenXML может осуществляться и прежними версиями Office.
Отметим, что формат OpenXML поддерживается не только офисными приложениями Microsoft — недавно компания Novell объявила о том, что версия OpenOffice, поставляемая ею на рынок, тоже будет поддерживать указанный формат.
Стандарты OpenXML
Формат OpenXML является отраслевым стандартом — в декабре организация ECMA стандартизовала спецификацию OpenXML.
Данный стандарт включает ряд более детальных стандартов. Главным из них является стандарт OPC (Open Packaging Convention), описывающий структуру файла, наличие различных типов данных в документе, взаимосвязь его составных частей, а также, при необходимости, цифровую подпись. Помимо OPC, структура документов OpenXML использует такие стандарты, как WordprocessingML, описывающий разметку текстовых документов, SpreadSheetML, определяющий структуру электронных таблиц, PresentationML, задающий структуру презентаций, DravingML, указывающий структуру графиков, диаграмм и некоторых графических объектов, а также стандарты, описывающие формулы, выражения и метаданные документа.
Отметим, что формат OpenXML предполагает различные способы интеграции данных документа с данными других приложений — он позволяет не просто применять схему форматирования, соответствующую функциональности современных версий офисных пакетов, но и определять свои схемы, позволяющие обмениваться данными с бизнес-приложениями.
Внутри документов OpenXML
СС точки зрения пользователя, документ в формате OpenXML представляет собой ZIP-архив. В этом можно убедиться, создав документ в Microsoft Word 2007, Microsoft Excel 2007 или Microsoft PowerPoint 2007 и заменив его расширение на *.zip. Этот архив содержит XML-данные, бинарные части, а также XML-описания их взаимосвязей.
Рассмотрим пример простейшего документа Word, cодержащего обычный текст, гиперссылку и графическое изображение (рис. 1).
Рис. 1. Пример документа Microsoft Word 2007
Данный документ имеет расширение *.docx (документ Microsoft Word 2007, не содержащий макросов). Заменив его расширение на *.zip и открыв его с помощью любого архиватора, поддерживающего метод упаковки ZIP, мы увидим структуру, изображенную на рис. 2.
Рис. 2. Структура документа Microsoft Word 2007
В корневой папке архива находится описание типов данных, содержащихся в документе, — внимательное изучение этого описания позволяет понять, что в документе имеется, к примеру, графическое изображение в формате GIF:
<?xml version=”1.0" encoding=”utf-8" standalone=
”yes” ?>
- <Types xmlns=”http://schemas.openxmlformats.org/
package/2006/content-types”>
<Default Extension=”rels” ContentType=”application/
vnd.openxmlformats-package.relationships+xml” />
<Default Extension=”gif” ContentType=”image/gif” />
<Override PartName=”/docProps/core.xml” ContentType=
”application/vnd.openxmlformats-package.core-
properties+xml” />
<Override PartName=”/word/document.xml” ContentType=
”application/vnd.openxmlformats-officedocument.
wordprocessingml.document.main+xml” />
</Types>
Папка _rels содержит файл с описанием взаимосвязей составных частей документа. В папке word находится файл document.xml, содержащий данные документа, в том числе текст «A paragraph», ссылку на рисунок с описанием его размеров и способа расположения в документе, указание на гиперссылку с описанием ее расположения, а также указания на стили текста:
<?xml version=”1.0" encoding=”UTF-8" standalone=
”yes” ?>
- <w:document xmlns:ve=”http://schemas.openxmlformats.
org/markup-compatibility/2006" xmlns:o=
”urn:schemas-microsoft-com:office:office” xmlns:r=
”http://schemas.openxmlformats.org/officeDocument/
2006/relationships” xmlns:m=”http://schemas.
openxmlformats.org/officeDocument/2006/math”
xmlns:v=”urn:schemas-microsoft-com:vml” xmlns:wp=
”http://schemas.openxmlformats.org/drawingml/
2006/wordprocessingDrawing” xmlns:w10=
”urn:schemas-microsoft-com:office:word” xmlns:w=
”http://schemas.openxmlformats.org/
wordprocessingml/2006/main” xmlns:wne=”http://
schemas.microsoft.com/office/word/2006/wordml”>
- <w:body>
- <w:p>
- <w:r>
<w:t>A paragraph</w:t>
</w:r>
</w:p>
- <w:p>
- <w:r>
<w:t xml:space=”preserve”>A</w:t>
</w:r>
- <w:hyperlink r:id=”rId2">
- <w:r>
- <w:rPr>
<w:color w:val=”0000FF” w:themeColor=”hyperlink” />
<w:u w:val=”single” />
</w:rPr>
<w:t>hyperlink</w:t>
</w:r>
</w:hyperlink>
</w:p>
- <w:p>
- <w:r>
- <w:drawing>
- <wp:inline>
<wp:extent cx=”4448175" cy=”1181100" />
<wp:docPr id=”1" name=”Picture 0" descr=
”openxmldeveloper.gif” />
- <wp:cNvGraphicFramePr>
<a:graphicFrameLocks xmlns:a=”http://schemas.
openxmlformats.org/drawingml/2006/main” noChange-
Aspect=”1" />
</wp:cNvGraphicFramePr>
- <a:graphic xmlns:a=”http://schemas.openxmlformats.org/
drawingml/2006/main”>
- <a:graphicData uri=”http://schemas.openxmlformats.org/
drawingml/2006/picture”>
- <pic:pic xmlns:pic=”http://schemas.openxmlformats.org/
drawingml/2006/picture”>
- <pic:nvPicPr>
<pic:cNvPr id=”0" name=”openxmldeveloper.gif” />
<pic:cNvPicPr />
</pic:nvPicPr>
- <pic:blipFill>
<a:blip r:embed=”rId1" />
- <a:stretch>
<a:fillRect />
</a:stretch>
</pic:blipFill>
- <pic:spPr>
- <a:xfrm>
<a:off x=”0" y=”0" />
<a:ext cx=”4448175" cy=”1181100" />
</a:xfrm>
- <a:prstGeom prst=”rect”>
<a:avLst />
</a:prstGeom>
</pic:spPr>
</pic:pic>
</a:graphicData>
</a:graphic>
</wp:inline>
</w:drawing>
</w:r>
</w:p>
</w:body>
</w:document>
Сами данные (графическое изображение и URL-гиперссылки) находятся в подпапках _rels и media папки word. Последняя, к примеру, содержит файл формата GIF — именно тот, что мы видели внутри документа.
Аналогичным образом сохраняются данные документов Microsoft Excel 2007 и Microsoft PowerPoint 2007. К примеру, документ презентации *.pptx, приведенный на рис. 3, представляет собой архив со структурой, показанной на рис. 4, и содержит описание дерева элементов слайдов, стилей, способов анимации, диаграмм и отображаемых с их помощью данных.
Рис. 3. Пример презентации Microsoft Power Point 2007
Рис. 4. Структура презентации
Microsoft Power Point 2007
Применение OpenXML в бизнес-приложениях
Отметим, что наличие открытого формата офисных документов и возможность их генерации или чтения с помощью любого прикладного программного интерфейса, поддерживающего работу с XML-данными, весьма привлекательны — они позволяют осуществить обмен документами между приложениями и генерацию документов без применения самих офисных приложений, что весьма удобно отнюдь не только в плане реализации идеи генерации документов серверным приложением.
Например, наличие открытого формата позволяет осуществлять сложные манипуляции с документами, такие как обработка помеченных специальными тэгами частей документа. К примеру, таким способом можно осуществлять удаление фрагментов, содержащих конфиденциальные данные, при передаче документа за пределы компании или ее подразделения с помощью электронной почты, обрабатывать формы и сохранять фрагменты документа в базе данных, выполнять запросы к корпоративным информационным системам и заменять их результатами тэги в документе. Можно также автоматически генерировать отчеты в виде офисных документов или производить сколь угодно сложную обработку документов. При этом приложения, осуществляющие подобные действия, не обязательно должны выполняться под управлением Windows.
Какие прикладные программные интерфейсы доступны для написания подобных приложений? По существу, любые API для различных платформ, позволяющие осуществлять создание ZIP-архивов и XML-документов. Такие программные интерфейсы доступны и для Java-разработчиков, и для разработчиков приложений для платформы Microsoft .NET.
Отметим, правда, что всеобъемлющих библиотек, позволяющих читать и создавать любые документы Microsoft Office с той же простотой, которая обеспечивается технологией COM, на данный момент нет, поэтому разработка решений с применением формата OpenXML в ряде случаев может оказаться не столь привлекательной, как это кажется поначалу. Тем не менее, учитывая наличие соответствующего стандарта и очевидный рост спроса на подобные библиотеки, ждать их появления осталось совсем недолго.
Подробнее об OpenXML можно узнать на ресурсе www.openxmldeveloper.org, содержащем немалое количество примеров кода, статей, советов, которые наверняка будут полезны авторам подобных решений.