Генерация документов на основе Excel шаблона

13 20

Очень часто при автоматизации бизнес процессов требуется формировать электронные документы на основе структурированных данных. Источником структурированных данных обычно являются справочники системы DIRECTUM. Потребность формирования электронных документов возникает по следующим причинам:

  • Электронный документ - удобное представление для согласования информации. Возможность отображать данные из нескольких источников данных;
  • Возможность установки ЭЦП - дополнительная защита результатов согласования;

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

  • Высокая трудоемкость разработки, которая обычно связана с необходимостью программирования визуальной части отчета. Это относится к rtf и Excel/html отчетам в системе 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.

 

scheme.zip (531,00 байт)

13
Авторизуйтесь, чтобы оценить материал.
2
Дмитрий Тарасов

Отличный материал! Надо будет как-нибудь на практике опробовать.

Только интересно, останется ли возможность таким образом формировать отчеты в 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 это не каснется.

Некоторые подробности можно посмотреть, например, тут.

Дмитрий Тарасов

Ну значит будем без опаски использовать данный метод генерации документов :)

Alexey Okishev

Есть одно ограничение, установленное экспериментальным путем. Если размер XML источника данных превышает ~50Мб то время импорта данных в Excel шаблон резко возрастает ~1.5часа, для документов менее  ~50Мб время импорта <5 мин. Для документа из примера  время формирования - секунды.

Дмитрий Тарасов

Еще бы таблицу с временными характеристиками формирования отчетов разными методами и разного объема кто-нибудь сделал :)

Чтобы сразу было видно в каком случае, каким методом лучше пользоваться :)

Андрей Шилов

а такую же штуку можно использовать для Word ?

Alexey Okishev
а такую же штуку можно использовать для Word ?

 

К сожалению нет. В Word другая модель работы с XML схемами. Разметку можно делать почти аналогичным образом, но:
1. Нельзя делать экспорт данных в эту разметку в документе Word. Точнее нет стандартных средств для этого. Можно, конечно, написать свою загрузку используя макросы, но тогда появится еще больше сложностей, например с безопасностью. Но введеные данные пользователем в разметку получить можно, т.е. использовать документ Word как форму ввода. 
2. Похоже, что невозможно сделать разметку для табличных элементов. Т.е. элементы, описанные в XSD схеме как списки данных, в Word  будут выглядеть как обычные реквизиты карточки.  
Михаил Лопинцев

у меня бета 2010 что-то он схему в каком-то слишком развернутом виде представляет...

Кто-нибудь может дать схему с которой он в 2010 работает для пробы?

Alexey Okishev
Кто-нибудь может дать схему с которой он в 2010 работает для пробы?


Добавил схему для примера с выпиской по счету.

Михаил Лопинцев

Спасибо. Постараюсь опробовать и отпишусь.

Михаил Лопинцев

Работает! Теперь будем пользоваться!

Алексей Пестов

Перетаскиваю элементы в разделе «Источник XML» на ячейку, ячейка становится текущей и ни чего не происходит Нахмуренный Или я что то неправильно делаю? Excel 2003.

Алексей Пестов

Всё ясно :(

"Область задач XML-источника

Примечание.  Средства XML, за исключением сохранения файлов в формате таблиц XML, доступны только в Microsoft Office Professional версия 2003 и отдельном выпуске Microsoft Office Excel 2003."

А у меня стандарт.

А как в такой реализации формировать промежуточные суммы по группам?

Наталья Лихолап

На строчке

XmlMap = Book.XmlMaps(REPORT_NAME)

выскакивает ошибка "Invalid Index". Не подскажите, в чем может быть дело?

Alexey Okishev
А как в такой реализации формировать промежуточные суммы по группам?

В таблицах данных (таблицы, которые формируются для импортируемых из XML данных) нет возможности настраивать промежуточные итоги, есть только возможность настроки общих итогов для всей таблицы. Для формирования промежуточных итогов можно воспользоваться сводной таблицой, которая будет читать данные из исходной таблицы с данными. Либо вариант с формированием данных итогов в коде, который формирует XML источник данных.

Alexey Okishev
XmlMap = Book.XmlMaps(REPORT_NAME)

скорее всего report_name не совпадает с именем карты в Excel-шаблоне. При добавлении XSD схемы в шаблон, Excel к наименованию добаляет суффикс "_карта".

Сергей Ершов

Перетаскиваю элементы в разделе «Источник XML» на ячейку, ячейка становится текущей и ни чего не происходит Нахмуренный Или я что то неправильно делаю? Excel 2003.

Аналогично поперетаскивал поля, но ничего не происхоодит. У меня Excel 2010. Может че не так сделал?
Алексей Немцев

Алексей, а как обновить XSD схему в существующем шаблоне? добавил новые данные в генерируемый XML-файл, что нужно сделать, чтобы Excel их "подхватил"?

Алексей Семакин
Алексей Немцев Алексей, а как обновить XSD схему в существующем шаблоне? добавил новые данные в генерируемый XML-файл, что нужно сделать, чтобы Excel их "подхватил"?

Авторизуйтесь, чтобы написать комментарий