Excel надає можливість додавати власні XML схеми (XSD) до робочих книг. При додаванні створюється XML карта, яка дає додаткові можливості при роботі з даними, а саме імпорт і експорт даних. Таким чином, ви можете завантажувати дані в документ зі сховища, а потім записувати дані назад за допомогою тієї ж XML схеми.
Процес починається з додавання XSD файлу до робочої книзі Excel. Як тільки XSD файл прикріплений, Excel створює XML карту, яка відображається в панелі завдань «джерело XML» (див рис. 1), яку користувач використовує для позиціонування даних в регіонах або окремих осередках. Excel використовує дану карту для управління взаємодією між позиціонувати регіонами і елементами XML схеми. Книга Excel може містити кілька XML карт, де кожна не буде залежати від інших. Також ви можете мати кілька карт, які будуть посилатися на одну схему. Коли користувач здійснює імпорт або експорт XML даних, Excel використовує карту для зв'язку вмісту позиціонованого регіону з елементами схеми.
Малюнок 1. Панель «Джерело XML»
У даній статті описується проект, заснований на XML картах, який дає можливість користувачам мати загальні шаблони документів, XML схеми і сховища даних розміщених в інтернеті. Свого роду Excel 365 своїми руками.
Тепер припустимо, що ми маємо робочу книгу Excel містить XML карту, з позиціонувати регіонами і імпортованими даними. Якщо подивитися на книгу з боку програміста, то її можна назвати слабосвязанной. Під словом "слабо зв'язаної" розуміється поняття програмування loose coupling, тобто шаблон документа має слабкий зв'язок з даними документа що дає можливість делегувати функцію складання документа від розробника користувачеві. Схожий підхід можна спостерігати в WPF, де робота над дизайном делегована від розробника дизайнеру, чого не було в Win Forms.
Тому, проект може застосовуватися і при реалізації модуля «виведення звітів в Excel» в бізнес додатках. При цьому розробнику не обов'язково створювати шаблон документа, користувач зможе зробити це сам.
архітектура
Даний проект має SOA (service oriented architecture) архітектуру. Клієнтом є Excel VSTO AddIn, а сервером є WCF сервіс. Сервіс надає наступну функціональність:
Робота з шаблонами.
Малюнок 4. Протокол взаємодії при роботі з шаблонами.
- Клієнт посилає запит Enumerate.
- На основі параметрів отриманих від клієнта, сервіс будує колекцію і ідентифікатор колекції (контекст). Ідентифікатор відправляється клієнтові.
- Клієнт відправляє запит Pull, який містить в якості параметра ідентифікатор колекції і кількість елементів які необхідно повернути. Так як ідентифікатор (контекст) є обов'язковим параметром, то запит Pull має сенс тільки після вдалого запиту Enumerate. Тому протокол WS-Enumeration називається протоколом станів.
- У відповіді на Pull запит сервер відправляє дані клієнта.
- Клієнт продовжує відправляти запит Pull поки не отримає у відповіді елемент
. - Після того як користувач вибрав елемент колекції для завантаження відправляється запит Get.
- У відповідь сервер надсилає примірник обраного елемента колекції. У нашому випадку це може бути шаблон, або XML схема, або XML подання даних.
SOAP message Enumerate
Типізовані і не типізовані дата контракти.
Для полегшення розуміння введемо три поняття:
- Дата контракт - це структура даних яка описується XML схемою.
- Збірний дата контракт - це XML схема + CLR тип, який, як правило успадковується від IXmlSerializable і при серілізаціі якого виходить XML документ відповідний XML схемі.
- Чи не типізований дата контракт - тільки XML схема. Екземпляром є XML документ відповідає даній XML схемі. При цьому спосіб формування документа не вказується.
Такий поділ корисно для більш чіткого поділу клієнтської і серверної частин. Так як клієнтська частина не повинна залежати від CLR типів, які використовується сервером для формування XML документів, то клієнт повинен використовувати тільки не типізовані дата контракти. В іншому випадку при додаванні нового дата контракту на сервері необхідно буде оновлювати збірки і на клієнтах, для того щоб додати відсутній CLR тип.
Таким чином клієнтська частина оперує з не типізований дата контрактами, а серверна з типізований.
Опис реалізації:
Припустимо ми маємо БД і ми хочемо здійснювати імпортування даних з БД розташовану на сервері в робочу книгу Excel розташовану на клієнті. Для цього в серверну частину нам необхідно додати дата контракт:
- створити XML схему описує структуру даних імпортованих з БД,
- створити CLR тип відповідний XML схемі,
- реалізувати метод DataContrac t [] Get DataContractName (), який здійснює звернення до БД і побудова колекції дата контрактів,
- Додати посилання на метод в словник методів GetData, а в якості ключа задати NamespaceName + RootElementName XML схеми.
Ключ NamespaceName + RootElementName є унікальним ідентифікатором дата контракту для всієї системи (клієнт - сервер).
Розглянемо випадок коли клієнт хоче імпортувати дані в робочу книгу Excel. Клієнт переглядає XML карти прикріплені до робочої книзі Excel, і для кожної карти відправляє запит EnumerateData на сервер, в якому в якості параметра передає ідентифікатор дата контракту. Сервер переглядає реалізований чи метод DataContract [] Get DataContractName () для даного дата контракту. Якщо немає, то нічого не відбувається. Якщо так, то метод Ge tDataContractName () виконується і будується колекція яка передається клієнту по протоколу WS-Enumeration.
На відміну від роботи з шаблонами ми не використовуємо WS-Transfer, а передаємо екземпляри дата контрактів у відповіді на запит Pull.
Збереження змін внесених в шаблон і дані
Excel надає можливість експортування даних. Але при цьому накладаються кілька обмежень на типи даних які можуть бути експортіпованни. Нижче перераховані деякі з таких обмежень:
- Якщо схема містить елемент sequence, то атрибут maxoccurs має дорівнювати 1.
- Тип не повинен містити вкладені списки (список списків, один список елементів містить інший список елементів).
Якщо тип задовольняє умовам експорту і реалізований метод збереження даних, то ми можемо зберігати зміни зроблені в Excel в БД.
При збереженні зберігаються як зміни шаблону так і зміни даних. Дана операція відбувається в два етапи:
- експорт даних з шаблона
- відправка шаблону і експортованих XML даних на сервер
Створення дата контракту
Припустимо ми хочемо мати можливість відображати в Excel структуру даних складається з декількох вкладених списків. Для прикладу візьмемо: Мир> Країни-> Області -> Міста.
«Світ» є кореневим елементом, який містить список країн. Кожна країна містить список областей, а кожна область список міст. Карта даних для подібного типу даних буде виглядати так:
Наступним кроком є створення CLR типів, при серілізаціі яких ми отримаємо Xml документ відповідний нашій карті. Для створення множинне вкладених структур зручно наслідувати тип від IXmlSerializable. В результаті для нашого випадку отримаємо чотири типи: