Office XP и обмен XML-данными

Наталия Елманова

Обмен XML-данными с Excel 2002

   Открытие и сохранение XML-документов

   Открытие и сохранение XML-документов с помощью VBA

Обмен XML-данными с Access 2002

   Импорт XML-документов

   Экспорт XML-документов

Заключение

 

В нашем журнале мы уже писали о том, что нового появилось в приложениях Microsoft Office XP. Настоящая статья посвящена лишь одному, но очень полезному новшеству — поддержке языка XML (Extensible Markup Language), вошедшего в последние годы в число самых популярных индустриальных стандартов и широко применяемого для обмена данными между приложениями.

При всей популярности XML на сегодняшний день известно не так уж и много средств подготовки XML-данных. В настоящее время XML в том или ином виде поддерживается подавляющим большинством СУБД и средств разработки, однако утилиты манипуляции XML-данными из их комплектов поставки — далеко не самый подходящий инструмент для конечных пользователей. Поэтому включение в Office XP (а именно — в Excel и Access) возможности сохранения документов в формате XML, равно как и чтения XML-данных, представляется весьма своевременным.

Обмен XML-данными с Excel 2002

Где и как можно применять поддержку XML в Excel? Один из типичных примеров — анализ с помощью Excel (или с помощью приложений — контроллеров автоматизации Excel) данных, полученных из нескольких разнородных источников, например из BizTalk Server или из приложений для других операционных систем, либо отправка данных из рабочей книги Excel в такие приложения. Преимущество такого подхода по сравнению с применением XML-редакторов очевидно: Excel в отличие от XML-редакторов хорошо знаком многим пользователям и разработчикам.

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

Открытие и сохранение XML-документов

Попробуем сохранить рабочую книгу Excel (рис. 1) в виде XML-документа, выбрав соответствующий его тип — XML Spreadsheet — в диалоге сохранения файла. В этом случае рабочая книга будет сохранена в XML-файле, структура которого основана на схеме, разработанной Microsoft.

Этот файл содержит все сведения о данных, включая оформление ячеек и формулы, за исключением диаграмм, OLE-объектов, графических изображений, а также проектов VBA. Естественно, можно в дальнейшем снова открыть этот XML-файл с помощью Excel.

Несмотря на немалый объем XML-файла, структура его довольно проста. Корневой его тэг — <Workbook>:

<?xml version="1.0"?>  
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"  
 xmlns:o="urn:schemas-microsoft-com:office:office"  
 xmlns:x="urn:schemas-microsoft-com:office:excel"  
 xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"  
 xmlns:html="http://www.w3.org/TR/REC-html40">  
... 

 

Тэги следующего уровня содержат сведения о документе (автор, дата создания и т.д.):

<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">  
  <Author>Natalia Elmanova</Author>  
  <LastAuthor>Natalia Elmanova</LastAuthor>  
  <Created>2001-07-28T20:11:35Z</Created>  
  <LastSaved>2001-07-28T20:27:04Z</LastSaved>  
  <Company>ComputerPress Magazine</Company>  
  <Version>10.2511</Version>  
 </DocumentProperties> 

 

Далее следуют тэг <Styles>, содержащий сведения о типах форматирования ячеек, и тэг <Names> для именованных диапазонов ячеек:

<Styles>  
  <Style ss:ID="Default" ss:Name="Normal">  
   <Alignment ss:Vertical="Bottom"/>  
   <Borders/>  
   <Font x:CharSet="204"/>  
   <Interior/>  
   <NumberFormat/>  
   <Protection/>  
  </Style>  
... 

 

Для каждого из листов рабочей книги имеется свой тэг <Worksheet>, содержащий сведения о листе и его ячейках:

<Worksheet ss:Name="Sheet2">  
  <Table ss:ExpandedColumnCount="4" ss:ExpandedRowCount="30" x:FullColumns="1"  
   x:FullRows="1">  
   <Column ss:AutoFitWidth="0" ss:Width="198.75"/>  
   <Column ss:AutoFitWidth="0" ss:Width="72.75"/>  
   <Column ss:AutoFitWidth="0" ss:Width="57.75"/>  
   <Column ss:AutoFitWidth="0" ss:Width="27.75"/>  
   <Row ss:Height="18">  
    <Cell ss:StyleID="s75"><Data ss:Type="String">Спецвыпуск &quot;Программное обеспечение&quot;, N 9'2000</Data></Cell>  
    <Cell ss:StyleID="s75"/>  
   </Row>  
…  
</Table>  
…  
</Worksheet> 

 

Как видите, структура XML-файла, создаваемого Excel, относительно проста. Это позволяет решить многие проблемы, такие, например, как генерация документов для последующей обработки в Excel на Web-серверах, откуда их и получает пользователь. Генерировать такие документы особенно удобно, если Web-сервер работает не под управлением Windows, ведь в этом случае для генерации xls-файлов нельзя использовать ни Excel как сервер автоматизации, ни имеющиеся на рынке готовые ASP-компоненты для генерации xls-файлов (такие как ExcelWriter от Software Artisans).

Отметим, однако, что с помощью Excel можно открыть и XML-файл более простого вида, например:

<?xml version="1.0"?>   
<Articles>   
  <Article>   
    <Name>Не просто UNIX…</Name>   
    <File>solaris.zip</File>   
    <Author>Павел Анни</Author>   
  </Article>   
  <Article>   
    <Name>В ожидании Windows XP</Name>   
    <File>winXP.zip</File>   
    <Author>Наталия Елманова</Author>   
  </Article>   
  <Article>   
    <Name>Проектирование информационных систем</Name>   
    <File>isdev1.zip</File>   
    <Author>Лилия Козленко</Author>   
  </Article>   
</Articles> 

В этом случае Excel преобразует XML-файл в таблицу примерно такого вида, как показано на рис. 2.

Каким требованиям должен удовлетворять XML-файл, чтобы его можно было открыть в Excel? В первую очередь он должен быть корректным (Well-formed, то есть документ должен содержать один корневой элемент, тэги должны быть парными и могут быть вложенными, элементы документа не должны перекрываться), иначе его преобразование в рабочую книгу Excel не будет выполнено. Кроме того, он должен содержать инструкцию <?xml version=”1.0"?>, поскольку в противном случае XML-документ будет проинтерпретирован как обычный текстовый файл.

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

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

Открытие и сохранение XML-документов с помощью VBA

Открытие XML-документов с помощью VBA осуществляется точно так же, как и открытие рабочих книг Excel:

Applicatio.Workbooks.Open “Articles.xml” 

Если открываемый файл в точности соответствует формату XML Spreadsheet, он будет распознан в соответствии с этим форматом. Если же открываемый файл представляет собой произвольный (но, естественно, корректный) XML-документ, он будет преобразован в таблицу наподобие изображенной на рис. 2.

Можно открыть XML-документ с помощью метода OpenXML коллекции WorkBooks:

Application.Workbooks.OpenXML “Articles.xml”

Отметим, что использование этого метода позволяет применить к открываемому документу несколько последовательных XSLT-преобразований — для этой цели у него имеется параметр Stylesheets.

Сохранение документов в формате XML выполняется таким же образом, как и сохранение документов в других форматах:

ActiveWorkbook.SaveAs “Articles.xml”, xlXMLSpreadsheet

Здесь xlXMLSpreadsheet — константа, идентифицирующая формат сохранения файла в виде XML Workbook.

Следует отметить, что можно сохранить файл непосредственно на Web-сервере, например:

ActiveWorkbook.SaveAs “http://MAINDESK/Articles.xml”, xlXMLSpreadsheet

Напомним, что возможность сохранения файлов Microsoft Office на Web-серверах, работающих под управлением Internet Information Services и FrontPage Server Extensions, либо на Web-серверах, поддерживающих протокол WebDAV (Web Distributed Authoring and Versioning), появилась еще в Microsoft Office 2000.

В заключение нашего краткого обзора поддержки XML в Excel VBA отметим, что Excel 2002 позволяет получать XML-данные из диапазонов Excel в формате XML Spreadsheet, например:

Dim xmldata As String
Set rng = Range(“A3:D8”)
xmldata = rng.Value(xlRangeValueXMLSpreadsheet)

Помимо этого можно получить данные из диапазона ячеек и в формате XML Data Reduced (XDR), используемом для хранения клиентских наборов данных ADO (disconnected recordsets) в формате XML:

xmldata = rng.Value(xlRangeValueMSPersistXML)

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

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

Обмен XML-данными с Access 2002

Импорт XML-документов

Access 2002 также позволяет импортировать XML-данные в свои базы данных, а также в базы данных SQL Server и MSDE. Рассмотрим простейший способ импорта XML-данных в Access на примере следующего XML-документа:

<?xml version="1.0"?>   
<Columns>  
 <Column Audience = "Пользователи (в том числе корпоративные)">  
   <Column_Name>Спецвыпуск "Программное обеспечение"</Column_Name>  
   <Column_Editor>Прохоров, Елманова</Column_Editor>  
   <Articles>   
     <Article>   
      <Name>Не просто UNIX…</Name>   
      <File>solaris.zip</File>   
      <Author>Павел Анни</Author>   
     </Article>   
     <Article>   
      <Name>В ожидании Windows XP</Name>   
      <File>winXP.zip</File>   
      <Author>Наталия Елманова</Author>   
     </Article>   
    </Articles>   
   </Column>  
  <Column Audience = "Разработчики, аналитики, руководители проектов">  
   <Column_Name>Средства разработки</Column_Name>  
   <Column_Editor>Елманова</Column_Editor>  
   <Articles>   
     <Article>   
      <Name>Проектирование информационных систем</Name>   
      <File>isdev1.zip</File>   
      <Author>Лилия Козленко</Author>   
     </Article>   
     <Article>   
      <Name>Введение в OLAP, часть 6</Name>   
      <File>OLAP6.zip</File>   
      <CD>Дополнительные материалы - 6 МБ</CD>  
      <Author>Алексей Федоров, Наталия Елманова</Author>   
    </Article>   
  </Articles>   
 </Column>  
</Columns> 

 

Для импорта этого XML-документа следует выбрать пункт меню Access File | Get External Data | Import, в диалоге открытия файла указать в качестве типа данных XML Documents и выбрать имя соответствующего файла. После этого происходят интерпретация выбранного файла и поиск в нем потенциальных таблиц. В данном случае Access распознает тэг <Column> с вложенными дочерними тэгами и интерпретирует их как одноименную таблицу. Затем Access находит набор тэгов <Article> и интерпретирует их как другую таблицу. Далее пользователю предлагается выбрать, импортировать только структуру таблиц или данные вместе со структурой либо просто добавить данные из XML-файла в уже имеющиеся таблицы (рис. 3).

Если выбрать импорт данных вместе со структурой, в текущей базе данных будут созданы две таблицы — Column и Article (рис. 4).

Обратите внимание: при импорте были проигнорированы некоторые атрибуты (например, атрибут Audience тэга Column) и дочерние тэги, отсутствовавшие в первом вхождении родительского тэга (например, дочерний тэг <CD>, появившийся лишь в четвертом вхождении тэга <Article>). Иными словами, структура будущей таблицы определяется тем, какие дочерние тэги присутствуют в тэге, преобразующемся в первую из ее записей. Это — неизбежные издержки отсутствия строгих требований к XML-документам (таких, как наличие «идеальной» табличной структуры), характерных для таблиц реляционных СУБД.

Отметим, что это не единственный способ импорта XML-данных в Access. При работе с XML-данными нередко используются XML-схемы, содержащие описание структуры данных, представленных в XML-документе, то есть правил, по которым XML-документ должен быть преобразован при импорте. Существует несколько стандартов XML-схем. В частности, до недавнего времени для этой цели широко применялся стандарт DTD (Document Type Definition), обладавший рядом недостатков, например поддержкой лишь ограниченного списка типов данных. Сейчас все большее распространение приобретает стандарт XSD (XML Schema standard), свободный от указанных недостатков. Именно он и поддерживается в Access 2002.

Типичное описание структуры данных в виде XSD-схемы выглядит так:

<xs:schema xmlns:xs="http://www.w3.org/2000/10/XMLSchema">   
  <xs:element name="Column" type="Column"/>   
  <xs:complexType name="Column">   
    <xs:sequence>   
      <xs:element name="Column_Name" type="xs:string"  minOccurs="1" maxOccurs="1" />   
      <xs:element name="Column_Editor" type="xs:string" minOccurs="1" maxOccurs="1"/>   
    </xs:sequence>   
  </xs:complexType>   
</xs:schema>  
XML-документ, ссылающийся на XSD-схему, обычно имеет примерно следующий вид:
<?xml version="1.0"?>   
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata"   
xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"    
xsi:noNamespaceSchemaLocation="xml_tables.xsd">  
 <Column Audience = "Пользователи (в том числе корпоративные)">  
   <Column_Name>Спецвыпуск "Программное обеспечение"</Column_Name>  
   <Column_Editor>Прохоров, Елманова</Column_Editor>  
   <Column_Note>Сентябрь 2001 г.</Column_Note>  
   </Column>  
  <Column Audience = "Разработчики, аналитики, руководители проектов">  
   <Column_Name>Средства разработки</Column_Name>  
   <Column_Editor>Елманова</Column_Editor>  
  </Column>  
</dataroot> 

 

Если импортировать такой файл в Access, мы получим пустую таблицу со структурой, соответствующей описанию, содержащемуся в XSD-схеме (в данном случае имеющую имя Column и состоящую из двух строковых полей — Column_Name и Column_Editor). После этого можно импортировать в готовую таблицу XML-документ; при этом тэги, соответствующие полям таблицы, будут распознаны, а остальные — проигнорированы, независимо от того, в какой по счету записи они встретились. Кстати, и в этом случае возможен импорт связанных таблиц в одном документе.

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

Экспорт XML-документов

Возможности экспорта Access в XML довольно разнообразны. Выбрав пункт меню File | Export и указав XML document в качестве типа данных, можно экспортировать таблицу Access в XML-документы как с описанием в виде XSD-схемы, так и без него; можно внедрить его в XML-документ или сохранить отдельно; можно также экспортировать несколько связанных таблиц и сгенерировать HTML- или ASP-файл для отображения данных в браузере (рис. 5).

Помимо таблиц в формат XML (с возможным одновременным созданием XSD-схемы) можно экспортировать результаты запросов, отчеты, формы. При необходимости можно сохранить структуру таблицы, запроса, формы или отчета в файле, содержащем сведения не только о типах полей, но и о том, как осуществляется соединение с источником данных и каким образом эти данные должны быть представлены. Для форм и отчетов такой файл сохраняется в виде кода на языке ReportML, специально разработанном Microsoft для XML-описания объектов баз данных Access. ReportML содержит набор тэгов для описания элементов форм, отчетов и страниц доступа к данным и применяется для преобразования сохраненных отчетов и форм в страницы доступа к данным.

Импорт и экспорт XML-документов с помощью VBA

Импорт XML-документа в VBA может быть осуществлен с помощью метода ImportXML объекта Application:

Application.ImportXML “D:\article.xml”, acStructureAndData

Второй параметр представляет собой константу, принимающую следующие значения: acStructureOnly — импортировать только структуру данных; acStructureAndData — импортировать и структуру, и данные; acAppendData — добавить данные к уже существующей таблице. Таким образом, список параметров полностью соответствует опциям, выбираемым при импорте файлов (см. рис. 3).

Экспорт XML-документа в VBA можно осуществлять с помощью метода ExportXML объекта Application:

Application.ExportXML acExportTable, “Article”, “D:\article.xml”, “D:\article.xsd”    

Первый параметр этого метода указывает, какой именно объект экспортируется — форма, запрос, таблица или отчет. Если экспорт производится из проекта Access, для экспорта также доступны представления и хранимые процедуры MSDE. Второй параметр указывает имя экспортируемого объекта, третий и четвертый — имена XML- и XSD-файлов (последний может быть опущен). Этот метод содержит еще несколько необязательных параметров, описывающих детали экспорта, о которых было сказано в предыдущем разделе.

Обратите внимание, что экспортировать таблицы и отчеты в формат XDR (как уже говорилось выше, он нередко применяется для обмена данными с другими ADO-приложениями) с помощью метода ExportXML, равно как и импортировать такие данные с помощью ImportXML, не удастся. Однако для этой цели можно создать объект типа ADO Recordset, выполнить запрос, заполняющий его данными, и затем сохранить в XDR-файле:

Set rs = New Recordset
rs.Open “SELECT * FROM Article”, CurrentProject.Connection
rs.Save “D:\Article.xml”, adPersistXML

Прочесть XDR-файл можно с помощью метода Open того же объекта ADO Recordset — этот метод загружает XDR-файл в буфер объекта Recordset:

Set rs = New Recordset
rs.Open “D:\Article.xml” 

Далее с объектом Recordset можно делать все что угодно — добавлять, удалять, изменять записи, добавлять его данные в имеющиеся таблицы.

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

Заключение

В настоящей статье мы рассмотрели поддержку обмена XML-данными в некоторых приложениях Office XP. Мы рассказали о возможностях чтения и сохранения XML-документов в Excel 2002, а также о возможностях и способах импорта XML-данных в Access и экспорта таблиц, запросов, форм и отчетов Access в XML-документы. Мы также выяснили, какие объекты и методы позволяют осуществлять эти действия в VBA-приложениях.

Отметим, однако, что XML применяется в самом Office XP не только для обмена данными с другими приложениями, но и для собственных, «внутренних», целей, в частности для создания смарт-тэгов. Но об этом мы расскажем в следующий раз.

КомпьютерПресс 10'2001