Реализация в SAP PI выгрузки в нестандартных форматах
Интеграционная шина SAP NetWeaver Process Integration – стандартное и рекомендуемое компанией SAP средство как для организации информационных обменов между системами SAP, так и для взаимодействия с внешними системами других производителей. Часто бывает, что внешние системы используют нестандартные форматы данных – например, проприетарные бинарные файлы, а также требуют обязательных дополнительных действий с этими файлами. Настоящая статья рассматривает вопрос выгрузки в формате MS Excel 2003.
Введение
Как правило, при реализации интеграционного обмена «с чистого листа» консультанты применяют рекомендуемые SAP форматы – XML, IDoc, изредка текстовые файлы (CSV/TXT). Однако при создании интеграционных решений, связанных с унаследованными или сторонними системами, консультантам приходится реализовывать специфические требования этих смежных систем – выгрузку/загрузку данных в бинарных форматах, специальную обработку данных и так далее. Эти задачи не решаются путем простых настроек и требуют либо покупки достаточно дорогостоящих специализированных адаптеров, либо программных разработок.
Материалом для статьи стала реализация требования контрагента, участвовавшего в интеграции, осуществить выгрузку интеграционных данных строго в формате Excel 2003, причем с выполнением нескольких дополнительных требований:
- Книга Excel должна содержать единственную страницу с определенным названием;
- Запись должна быть запрещена путем установки пароля, заранее неизвестного контрагенту;
- В целях последующего развития должна быть предусмотрена возможность электронной подписи файла средствами Excel.
Так как стандартные адаптеры, поставляемые в составе SAP PI, подобных функций не предоставляют, было принято решение выполнить программную разработку.
Выбор этапа и инструментария разработки
С целью упрощения дальнейшего изменения и развития решения был использован стандартный механизм преобразования сообщений SAP PI – трансформация сообщений. Из имеющихся вариантов реализации – Java, ABAP, Message Mapping, XSLT – единственным подходящим является Java. Осталось только выбрать наиболее удобную для реализации Java-библиотеку, работающую с форматами MS Office.
Последние несколько лет стандартом де-факто стала доступная в исходных кодах библиотека Apache POI. Существует также ряд других библиотек, но по сочетанию открытости, богатства функционала и оперативности устранения проблем у нее немного соперников.
Однако реализация формирования файлов Excel непосредственно из Apache POI достаточно трудоемка, содержит множество рутинных операций. Для ускорения процесса и опять же простоты дальнейшего сопровождения, в связке с Apache POI была выбрана весьма удобная библиотека jXLS. Она является фактически надстройкой над Apache POI, которая позволяет быстро формировать файлы Excel на основании шаблонов и простейшего макроязыка. То есть, достаточно создать готовый файл Excel со всеми необходимыми форматированиями, вставив в ячейки вместо конечных значений имена переменных (например, $AMOUNT вместо суммы), а jXLS уже сама подставит конкретные значения в соответствующие ячейки, сформирует таблицы, рассчитает подсуммы и выполнит прочие действия.
Таким образом, к началу реализации было принято следующее архитектурное решение:
- Формирование выходного файла Excel 2003 выполняется на этапе Java Mapping-а;
- Инструмент разработки – стандартная NetWeaver Development Studio;
- Базовая библиотека для работы с Excel – Apache POI;
- Используемая надстройка – jXLS.
Реализация проекта выгрузки
Разработка
Реализация класса мэппинга начинается с создания проекта Java. В простейшем случае можно создать простой проект Java с использованием мастера через меню File –> New –> Project…(Рис.1).
Рис. 1. Мастер создания проектов NWDS
В нашем случае, проект назван ExcelConverter. В зависимости проекта необходимо подключить стандартную библиотеку SAP PI com.sap.xpi.ib.mapping.lib.jar, содержащую определения стандартных интерфейсов Java-мэппинга. Кроме того, так как цель проекта – реализация выгрузки в формат Excel, в список библиотек также необходимо включить пакет jXLS (в том числе в него входит набор библиотек Apache POI). Это, в частности:
- commons-collections
- commons-beanutils
- commons-digester
- commons-logging
- poi
- poi-ooxml-schemas
- poi-ooxml
- commons-jexl
Конкретные версии библиотек лучше уточнить непосредственно в процессе реализации, так как проекты постоянно развиваются и выпускают обновления. Следует также обратить внимание на соответствие используемых версий библиотек и версии JDK, используемой SAP PI. В нашем случае, ограничением при выборе версии библиотеки послужила необходимость запуска именно на версии JDK 1.6 или более ранней.
В созданном проекте был добавлен класс Converter, реализующий интерфейс Java-мэппинга com.sap.aii.mapping.api.StreamTransformation. Этот интерфейс содержит всего два метода: setParameter, принимающий при запуске набор дополнительных параметров мэппинга (полезная функция для увеличения гибкости), и собственно метод преобразования сообщений - execute. Именно последний метод представляет для проекта наибольший интерес. В нем всего два параметра: поток исходного сообщения (java.io.InputStream) и поток-результат преобразования (java.io.OutputStream). Соответственно, на вход преобразования будет поступать исходное сообщение в формате XML, а в выходной поток алгоритм будет писать уже бинарные данные.
Первым шагом к реализации алгоритма будет создание шаблона выходного файла непосредственно в формате Excel. Ниже приводится пример такого файла, созданного для проекта: (Рис.2)
Рис. 2. Пример шаблона Excel для библиотеки jXLS
Как видно из скриншота, шаблон представляет собой обычный файл Excel, в котором вписаны наименования подставляемых при формировании файла параметров.
Соответственно, для формирования выходного файла требуется выполнить следующие шаги:
- Произвести разбор исходного XML-сообщения.
- Создать набор Java-объектов, поместить их в именованный список (java.util.Map).
- Загрузить в память приведенный выше шаблон Excel.
- Вызвать библиотеку jXLS, передав ей шаблон и список значений.
- Записать полученный результат в выходной поток.
Шаг 1. Разбор исходного XML-сообщения
Принципы разбора исходного XML-сообщения многократно рассматривались в справочных материалах SAP, а также публикациях отдельных консультантов, поэтому описывать данную реализацию подробно не будем. Была использована обычная обработка с использованием SAX-парсера – создан класс InputHandler, расширяющий родительский класс org.xml.sax.helpers.DefaultHandler. Далее этот класс вызывается с передачей ему исходного сообщения в методе execute:
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser saxParser = factory.newSAXParser();
InputHandler handler = new InputHandler();
saxParser.parse(in, handler);
Шаг 2. Создание набора Java-объектов
По окончанию разбора сообщения в классе InputHandler должен быть сформирован набор объектов для передачи в библиотеку jXLS. Принципы создания классов для передачи достаточно просты:
- Класс параметра для листа Excel должен быть обычным POJO-объектом.
- Он должен реализовать интерфейс java.io.Serializable.
- Все поля также должны быть либо простыми типами, либо реализовать java.io.Serializable.
В качестве примера приведен код одного из классов-данных:
package ru.energodata.reestr.psb.dao;
import java.io.Serializable;
public class ReestrHeader implements Serializable {
private String docnum;
private String amount;
private String currency;
private Estimate estimate = new Estimate();
public String getCurrency() {
return currency;
}
public void setCurrency(String currency) {
this.currency = currency;
}
public Estimate getEstimate() {
return estimate;
}
public void setEstimate(Estimate estimate) {
this.estimate = estimate;
}
public String getDocnum() {
return docnum;
}
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
ЗарегистрироватьсяУ вас уже есть учетная запись?
Войти