Очень часто при автоматизации бизнес процессов требуется формировать электронные документы на основе структурированных данных. Источником структурированных данных обычно являются справочники системы DIRECTUM. Потребность формирования электронных документов возникает по следующим причинам:
Обычно для формирования документов пользуются разработкой интегрированных отчетов, которые после формирования можно сохранять как электронные документы в архив. Недостатки такого подхода, на мой взгляд, следующие:
Предлагаю использовать альтернативный вариант формирования электронных документов на основе Excel шаблона, который решает описанные выше недостатки. Механизм основан на возможности Excel использовать элементы присоединенной XSD схемы данных для разметки шаблона. Возможность доступна начиная с версии Excel 2003.
Приведу пример разметки шаблона документа «Выписка по счету» в Excel 2007. Путь до опции подключения XSD схемы данных: Вкладка разработчик(на риббоне)\Источник\Карты XML…\Добавить. Откроется диалоговое окно для выбора файла с описанием схемы данных. После подключения схемы в разделе «Источник XML» появится элементы подключенной XSD схемы, которые можно перенести в любую ячейку шаблона:
XSD схема – это обычный XML файл, в котором описаны элементы данных. XSD схема для приведенного примера выглядит следующим образом:
Для формирования XSD схемы рекомендую использовать инструменты Visual Studio 2008, но можно сделать и в обычном текстовом редакторе.
После того, как шаблон настроен и выполнена разметка полей данных его можно сохранить в системе и в установки вынести параметр, к которому можно будет привязаться в разработке ISBL. Для того, чтобы программно создать электронный документ на основе настроенного шаблона, нужно сделать следующее:
1. Подготовить XML файл с данными, соответствующий подключенной XSD схеме шаблона. XML данные для описанной в примере XSD схемы будут выглядеть следующим образом:
Формирование XML документа на ISBL нужно выполнить с помощью библиотеки msxml.dll:
…
REPORT_NAME = “ВыпискаПоСчету_карта”
XMLDocument = CreateObject("MSXML.DOMDocument")
ProcInstruction = XMLDocument.CreateProcessingInstruction("xml"; 'version="1.0" encoding="windows-1251" standalone="yes"')
XMLDocument.appendChild(ProcInstruction)
RootElement = XMLDocument.CreateElement(REPORT_NAME)
XMLDocument.appendChild(RootElement)
…
2. Получить шаблон документа и экспортировать его на диск.
…
TemplateID = Конст(‘xxx’)
Template = Edocuments.GetObjectByID(TemplateID)
Template.Export(VersionNumber; Path; FALSE)
…
3. Открыть экспортированный шаблон в Excel и передать в него подготовленные данные:
… Excel = CreateObject("Excel.Application") Book = Excel.WorkBooks.Open(Path) Sheet = Book.WorkSheets(1) // Загрузка данных в Excel XmlMap = Book.XmlMaps(REPORT_NAME) XmlMap.ImportXML(XMLDocument.xml) Book.Save Book.Close Excel.Quit …
4. При необходимости открыть документ для просмотра либо сразу сохранить документ в хранилище системы DIRECTUM.
Пример сформированного документа «Выписка по счету»:
Кроме экспорта данных в шаблон Excel можно выполнить и обратное действие – импортировать данные из полей разметки шаблона. Т.е. в этом сценарии работы шаблон Excel будет выступать в качестве электронной формы для ввода данных, которые можно будет импортировать в систему DIRECTUM.
Отличный материал! Надо будет как-нибудь на практике опробовать.
Только интересно, останется ли возможность таким образом формировать отчеты в MS OFFICE 2010 с учетом вот этой информации:
Microsoft проиграла дело по поводу Office
Дело о правомерности использования некоторых XML-технологий в Office, в котором участвовало две стороны: Microsoft и компания i4i проиграно Microsoft. Теперь компания Microsoft обязана прекратить продавать продукты из пакета Office, которые содержат код подпадающий под патенты i4i.
У Microsoft есть время до 11 января. Как сообщается в официальном заявлении, данные меры касаются только США и не касаются продуктов которые уже были проданы. Видимо за проданные будет уплачен штраф (есть информация про $200 млн.). Кроме того, Microsoft заявляет, что уже готовилась к подобному решению суда и к 11 января 2010 года начнет поставлять Office 2007 в США без спорного кода. Таким образом партнеры и клиенты Microsoft никак не ощутят на себе данное решние суда. Office 2010 Beta доступный для тестирования УЖЕ не содержит этот код и не подпадает под патентную атаку.
Только интересно, останется ли возможность таким образом формировать отчеты в MS OFFICE 2010 с учетом вот этой информации:
Это касается только механизма CustomXML, который используется в Word, причем, судя по материалам в сети, только для WordprocessingML. Excel это не каснется.
Некоторые подробности можно посмотреть, например, тут.
Ну значит будем без опаски использовать данный метод генерации документов :)
Есть одно ограничение, установленное экспериментальным путем. Если размер XML источника данных превышает ~50Мб то время импорта данных в Excel шаблон резко возрастает ~1.5часа, для документов менее ~50Мб время импорта <5 мин. Для документа из примера время формирования - секунды.
Еще бы таблицу с временными характеристиками формирования отчетов разными методами и разного объема кто-нибудь сделал :)
Чтобы сразу было видно в каком случае, каким методом лучше пользоваться :)
а такую же штуку можно использовать для Word ?
у меня бета 2010 что-то он схему в каком-то слишком развернутом виде представляет...
Кто-нибудь может дать схему с которой он в 2010 работает для пробы?
Добавил схему для примера с выпиской по счету.
Спасибо. Постараюсь опробовать и отпишусь.
Работает! Теперь будем пользоваться!
Перетаскиваю элементы в разделе «Источник XML» на ячейку, ячейка становится текущей и ни чего не происходит Или я что то неправильно делаю? Excel 2003.
Всё ясно :(
"Область задач XML-источника
Примечание. Средства XML, за исключением сохранения файлов в формате таблиц XML, доступны только в Microsoft Office Professional версия 2003 и отдельном выпуске Microsoft Office Excel 2003."
А у меня стандарт.
А как в такой реализации формировать промежуточные суммы по группам?
На строчке
XmlMap = Book.XmlMaps(REPORT_NAME)
выскакивает ошибка "Invalid Index". Не подскажите, в чем может быть дело?
В таблицах данных (таблицы, которые формируются для импортируемых из XML данных) нет возможности настраивать промежуточные итоги, есть только возможность настроки общих итогов для всей таблицы. Для формирования промежуточных итогов можно воспользоваться сводной таблицой, которая будет читать данные из исходной таблицы с данными. Либо вариант с формированием данных итогов в коде, который формирует XML источник данных.
скорее всего report_name не совпадает с именем карты в Excel-шаблоне. При добавлении XSD схемы в шаблон, Excel к наименованию добаляет суффикс "_карта".
Алексей, а как обновить XSD схему в существующем шаблоне? добавил новые данные в генерируемый XML-файл, что нужно сделать, чтобы Excel их "подхватил"?
Авторизуйтесь, чтобы написать комментарий