Как из sap выгрузить в excel
Перейти к содержимому

Как из sap выгрузить в excel

Как из sap выгрузить в excel

Из моего опыта общения с парой SAP-Excel могу сказать, что существует три основных способа вставки табличных данных в Excel.
1. Можно вставить данные в Excel через буфер обмена на клиентской машине. (для этого их надо туда скопировать, например, с помощью ФМ CLPB_EXPORT)
2. Можно выгрузить tab-delimited файл клиенту и открыть его в Excel.
3. Можно выгрузить файл в каком-нибудь формате на машину клиенту и вставить его в Excel через QueryTables.

При втором способе почти не получится влиять на преобразование типов полей, а в первом варианте это не достаточно гибко. В третьем же случае можно определять формат вставляемого файла как угодно (задавать и разделитель, и формат столбцов).

Названия готового ФМ сам не знаю, но можно довольно легко написать собственный ФМ, работающий с Excel через OLE, например, одним из перечисленных способов (при этом гибкость реализации будет выше).

_________________
Счастье есть!

Часовой пояс: UTC + 3 часа

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]

SAP форум.RU © 2000-2012 Михаил Вершков

Python для генерации статических отчетов XLSX по данным SAP-систем

Статья предназначена в первую очередь для консультантов и архитекторов, работающих с продуктами SAP, перед которыми стоит задача проектирования и реализации решения по подготовке отчетности в формате Excel.

В настоящее время все большую популярность набирают облачные решения для визуализации данных, демонстрируя двузначный рост год-к-году по большинству показателей. Однако не все компании — клиенты поставщиков облачных решений могут позволить себе использовать “облака” по самым разным причинам: от требований безопасности данных до недостаточной функциональности или даже более высокой стоимости владения по сравнению с on-premise.

Поэтому время от времени возникают задачи подготовки отчетности для визуализации в on-premise-инструментах. Автор долгое время работал и продолжает работать с решениями SAP, поэтому именно решения SAP (SAP BW/4, SAP S/4), как поставщики данных для отчетности, наиболее близки. Однако предлагаемый подход может быть скопирован и на другие системы-источники. Никаких препятствий к этому нет.

Задача формулируется так: реализовать on-premise решение по автоматической и регулярной подготовке отчетов по бизнес-данным SAP-систем (BW/4 или S/4).

Технические требования к отчетам:

минимальное время отклика при открытии отчета пользователем (2-4 сек)

возможность смотреть отчеты как на настольном, так и на мобильном устройстве (планшет, телефон)

комбинация табличных и графических представления данных на одной странице

несколько страниц (вкладок) с отчетами

корректное разбиение на страницы при печати на принтере/PDF.

отдельные табличные представления могут содержать большое число строк и/или столбцов (более 1 млн ячеек совокупно).

реализуют кросс-табличный формат

содержат итоги, подитоги по строкам и столбцам.

содержат иерархические группировки

содержат данные нарастающим итогом по календарным аналитикам

поддерживают функции “автофильтр”, “фиксация прокрутки” и некоторые другие функции Excel (например, комментарии к ячейкам, merge cells)

добавление статических картинок

условное форматирование ячеек

построены по csv-выгрузкам данных из исходных систем. Это означает, что отчеты содержат данные, сформированные на момент выгрузки данных из исходных систем. Чем чаще выполняется выгрузка, тем более актуальные данные в отчетах.

Наиболее близкими стандартными инструментами SAP, подходящими для этой задачи, является a)SAP BW on HANA + Broadcaster или b)SAP BW/4 HANA + SAP BI Platform + SAP Crystal Report Enterprise + Publishing.

Вариант a) подходит для клиентов, остающихся пока на решении SAP BW on HANA.

Вариант b) — для клиентов, перешедших на новое перспективное решение SAP BW/4 HANA и имеющих лицензии SAP BI Platform

Однако, оба этих варианта имеют те или иные ограничения, которые может быть крайне непросто или даже невозможно преодолеть, в т.ч. даже с добавлением “точечной” разработки (макросы VBA, ABAP-программы или кода на встроенном script-языке в Crystal Reports). Даже если в первоначальной постановке задачи нерешаемых требований нет, это не означает, что в будущем такие требования не появятся. Это означает, что лучше с самого начала выбрать подход, достаточно гибкий для решения как известных сейчас, так и неизвестных, но ожидаемых будущих требований.

Очевидно, что реализация третьего варианта, варианта с) будет с высокой долей собственной разработки отдельных компонентов целевого решения. Какие же опции могут существовать для технологических решений SAP в этом случае?

Существуют классы из библиотеки ABAP2XLSX (Apache2 licence model). Написанные на ABAP, они содержат методы по генерации XLSX-файла без использования Excel: XLSX-файлы создаются напрямую из кода на ABAP. Создав программную “обертку” для этих классов внутри S/4 или BW, вы можете генерировать XLSX-файлы с требуемым форматированием. Запускать эту генерацию возможно как диалоговом, так и в пакетном (batch) режиме, что позволяет настроить автоматическую публикацию, рассылку и пр. по расписанию или событиям.

Таким образом, все стадии процесса: извлечение данных, преобразования в формат отчета и генерация XLSX реализуются на одном языке (ABAP), и являются неотъемлемой частью хорошо знакомой в SAP-мире инфраструктуры жизненного цикла и среды выполнения ABAP-кода.

Но представляет интерес и альтернативный подход, который при определенном масштабе более эффективен и функционален. Речь идет о генерации XLSX-файла в коде на Python. Существует минимум две очень популярные python-библиотеки генерации Excel-кода: openpyxl и xlsxwriter. Это дает больше гибкости при выборе и развитии вашего решения, чем использование единственно возможной библиотеки на ABAP.

Процессы целевого решения могут выглядеть, например, так:

Данные системы-источника выгружаются на регулярной основе в текстовые csv-файлы. Файлы выгружаются в каталоги сервера приложений SAP или на выделенный файловый сервер или даже в облачный каталог, если это позволяют политики безопасности.

csv-файлы считываются Python-программой, которая затем выполняет обработку данных (расчет подитогов, итогов, расчет нарастающих итогов, объединение нескольких наборов данных, подтягивание наименований к кодам аналитик и т.п и т.д.), генерацию и публикацию XLSX-файла

Архитектура целевого решения состоит из:

SAP-системы-источника данных, которая генерирует csv-файлы. Генератором файлов может быть:

В последнем случае легко настроить считывание данных из т.н. BW-запросов, в которых нередко реализуют сложную логику расчета бизнес-показателей пользовательских отчетов. Инструмент создания BW-моделей и -запросов (SAP HANA Studio BWMT) нельзя назвать инструментом “конечного пользователя”, но тем не менее он обладает мощным функционалом, позволяющим в создании даже сложных объектов во многих случаях обходиться без программирования. Однако, верно и то, что с помощью этого инструмента добиться желаемой производительности (см. требования выше) практически не представляется возможным. Поэтому результат работы BW-запроса — [кросс-]табличное представление данных — приходится визуализировать в Excel не стандартным инструментом SAP Analysis for Excel, а просто Excel. Но XLSX-файл нужно ещё подготовить и где-то разместить. А для этого применяются.

Python-программы, использующие библиотеки:

работы с данными — pandas;

генерации XLSX-файлов — openpyxl или/и xlsxwriter;

любые другие библиотеки Python для дополнительных преобразований считанных из файлов данных;

Сервер для запуска Python-программ. При наличии лицензий, можно рассмотреть SAP Data Intelligence, но подойдут и другие решения. На самых начальных этапах, при небольшом количестве Python-программ — генераторов XLSX-файлов можно обойтись средствами планирования задач операционной системы

Полученный XLSX-файл конечный пользователь может просмотреть как в Excel, так и его opensource-аналогах (LibreOffice, OpenOffice). Последнее особенно важно для компаний, в которых не используются продукты Microsoft Office или планируется от них отказаться. Использование же стандартного on-premise SAP-инструмента для визуализации данных BW-отчетов — SAP Analysis for Excel невозможно без Excel, т.к. технически он является его addOn.

Несколько слов про центральную часть архитектуры — Python-программы. Принимая во внимание, что генерировать XLSX-файл можно и с помощью ABAP-библиотеки, в Python это делать во многих аспектах удобнее:

существенно больше программистов на Python, чем на ABAP. Python изучают чуть ли не в школах, не говоря уже о ВУЗах. Нетрудно предположить, что и уровень зарплатных ожиданий для Python также ниже при прочих равных

Существенно больше готовых и бесплатных Python-библиотек, которые выполнят необходимые преобразования и расчеты.

возможно разрабатывать Python-код для генерации XLSX-файлов без доступа к SAP-системам, практически в offline-режиме. Так удобнее отдавать работу на outsource.

проще пользоваться всеми возможностями git-репозиториев. Да, в ABAP это тоже возможно, но это гораздо менее распространено.

Более лаконичный код, чем на ABAP.

Например, при таких исходных данных для визуализации

следующий компактный код

выполняет преобразование строк в исходном массиве: разбивает строку на поля, разделенные ;. Последние 2 поля, которые по смыслу есть “показатели”, сохраняются как числа float. Первые 4 поля — это аналитики и хранятся как строки.

На выходе кода — кросс-таблица, в которой по строкам — развертка по полям A и B, а по столбцам — развертка по полям C и D. Поле E — один (из двух в исходных данных) показателей, используемый в кросс-таблице.

Если добавить код для расчета подитогов и итогов по строкам и столбцам (еще 5 — 6 строк кода), получится

Очевидно, что это уже почти готовая “матрица” для публикации в XLSX, после чего останется только применить форматирование [опять же, методами Python-библиотеки генерации XLSX] и файл готов. Файл можно публиковать средствами Python или операционной системы, и затем открывать в Excel, LibreOffice и т п.

Что касается производительности и потребления системных ресурсов при выполнении всех шагов процесса, начиная от выгрузки данных в csv из SAP и заканчивая генерацией XSLX-файла в Python-программе, то предложенная архитектура позволяет управлять распределением нагрузки, перенося ее с одних компонент на другие.

Например, если Python-код потребляет слишком много памяти при выполнении подготовки данных (слишком сложные расчеты или/и миллионы строк в выгрузке), то можно, не меняя степени параллелизации выполнения Python, и не выполняя аппаратного масштабирования, рассмотреть перенос вычислений или/и большее уплотнение данных на стороне SAP-сервера. Возможно и обратное, когда уменьшать нагрузку следует уже на SAP-сервер.

SAP R/3 форум ABAP консультантов
Russian ABAP Developer’s Club

Russian ABAP Developer’s Club Forum Index -> Submit a new program | Новые материалы, программы для сайта
View previous topic :: View next topic
Author Message
Anton Sikidin
Участник

соглашение по переменным:
-все переменные используемые в отчете должны быть определены глобально
-таблицы используемые в отчете должны быть без headerline.

соглашение по заполнению шаблона:
-если в отчете используются таблицы то первый столбец должен содержать либо текст либо 1 пробел,иначе отчет не откроется.
— одна переменная на ячейку
— переменная заключается в $# $#, например $#sy-uname$#
— строка содержащая ячейки таблицы должна содержать текст $!$Table_name$!$, где Table_name имя внутренней таблицы определенной глобально без headerline
— ячейки таблицы содержат переменные $#<wa>-field1$# $#<wa>-field2$# $#<wa>-field3$# и т.д., где field1 field2 field3 имена полей таблицы
— перед сохранением установить курсор в поле А1

шаблон сохраняем как таблица xml 2003
идем в транзакцию smw0 выбираем двоичные данные для WEB RFC приложений, F8, F8, параметры настройки->ведение MIME типов, добавить туда *.xml .

загружаем шаблон, выбираем имя.

в программе когда все переменные посчитаны вызвать форму

Code:
PERFORM export_to_excel TABLES it_source USING ‘Z_TEST_EXPORT_TO_EXCEL’.

в таблице it_source находится сгенерированный xml документ, Z_TEST_EXPORT_TO_EXCE — имя шаблона.

тестовый шаблон в приложении test.xml,

рабочий легкоадоптируемый пример ниже, впримере показано как правильно выгрузить xml документ в кодировке utf-8 и избежать проблем с конвертацией.

Генерировать xml отчеты на ABAP — это как генерировать html странички на PHP: нет в этом ничего страшного и интересного.

парсер странно работает,и покорежил текст программы, прикладываю в приложении sample.rar

types
: tt_string TYPE STANDARD TABLE OF string
.

data
: gt_outtab type table of TADIR
, it_source TYPE TABLE OF string
, code type CPCODEPAGE
, CODEPAGE TYPE ABAP_ENCODING

*выбираем данные
select * from TADIR into table gt_outtab up to 5 rows.

* генерируем XML
PERFORM export_to_excel TABLES it_source USING ‘Z_TEST_EXPORT_TO_EXCEL’.

* оперделяем кодировку
CALL FUNCTION ‘SCP_CODEPAGE_BY_EXTERNAL_NAME’
EXPORTING
external_name = ‘utf-8’
kind = ‘H’
IMPORTING
sap_codepage = code
EXCEPTIONS
not_found = 1
OTHERS = 2.

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
WRITE code TO codepage.
ENDIF.

* выгружаем данные
CALL FUNCTION ‘GUI_DOWNLOAD’
EXPORTING
filename = ‘c:\temp\123.xls’
filetype = ‘DAT’
codepage = codepage
TABLES
data_tab = it_source
EXCEPTIONS
file_write_error = 1
no_batch = 2
gui_refuse_filetransfer = 3
invalid_type = 4
no_authority = 5
unknown_error = 6
header_not_allowed = 7
separator_not_allowed = 8
filesize_not_allowed = 9
header_too_long = 10
dp_error_create = 11
dp_error_send = 12
dp_error_write = 13
unknown_dp_error = 14
access_denied = 15
dp_out_of_memory = 16
disk_full = 17
dp_timeout = 18
file_not_found = 19
dataprovider_exception = 20
control_flush_error = 21
others = 22.
if sy-subrc <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
endif.

form export_to_excel TABLES it_source type tt_string using IV_OBJID TYPE W3OBJID .

: KEY type WWWDATATAB
, HTML LIKE W3HTML OCCURS 100 WITH HEADER LINE
, MIME LIKE W3mime OCCURS 100 WITH HEADER LINE
, lv_tabname type string
, lt_bufer TYPE TABLE OF string WITH HEADER LINE
, wa_bufer type string
, lt_string TYPE TABLE OF string
, lv_str TYPE string
, lv_str2 TYPE string
, lv_str3 TYPE string
, lv_string type string

LOOP AT lt_bufer INTO wa_bufer .

find REGEX ‘(\$#(.*)\$#)’ in wa_bufer SUBMATCHES lv_str lv_str2.
IF sy-subrc = 0.

REPLACE lc_lt in lv_str2 WITH ‘<‘.
REPLACE lc_gt in lv_str2 WITH ‘>’.

ASSIGN (lv_str2) to <field>.
lv_str3 = <field>.

REPLACE REGEX ‘(\$#(.*)\$#)’ in wa_bufer WITH lv_str3.
APPEND wa_bufer to it_source.

APPEND wa_bufer to it_source.

" if tabname defined — loop at table
IF lv_tabname is not INITIAL.

ASSIGN (lv_tabname) to <table>.

LOOP AT <table> ASSIGNING <wa>.
process_buffer.
ENDLOOP.

clear lv_tabname.
REFRESH lt_bufer.

" get key of object
SELECT single * FROM WWWDATA AS F INNER JOIN TADIR AS P
ON F

OBJ_NAME
INTO CORRESPONDING FIELDS OF KEY
WHERE F

RELID = ‘MI’
AND P

PGMID = ‘R3TR’
AND P

OBJECT = ‘W3MI’
AND P

" get object
CALL FUNCTION ‘WWWDATA_IMPORT’
EXPORTING
KEY = KEY
TABLES
HTML = HTML
MIME = MIME
EXCEPTIONS
OTHERS = 1.

" convert raw data to string
CALL FUNCTION ‘WSI_RAW_TO_STRING’
IMPORTING
OUTPUT = lv_string
TABLES
INPUT = MIME
EXCEPTIONS
CONVERTION_FAILURE = 1
OTHERS = 2.
IF SY-SUBRC <0>CR_LF INTO TABLE lt_string.

" process template
REFRESH it_source.

LOOP AT lt_string INTO lv_string .

REPLACE ALL OCCURRENCES OF »» IN lv_string WITH »»».

find regex ‘(ss:ExpandedRowCount="\d+")’ in lv_string SUBMATCHES lv_str lv_str2.
IF sy-subrc = 0.
REPLACE REGEX ‘(ss:ExpandedRowCount="\d+")’ in lv_string WITH ».
ENDIF.

" find table name
find REGEX ‘(\$!\$(.*)\$!\$)’ in lv_string SUBMATCHES lv_str lv_str2.
IF sy-subrc = 0.
REPLACE REGEX ‘(\$!\$(.*)\$!\$)’ in lv_string WITH ».
lv_tabname = lv_str2.
ENDIF.

" new row occured, process buffer
find regex ‘(<Row)’ in lv_string .
IF sy-subrc = 0.
flush.
ENDIF.

"reach end of row, add last line to buffer and process buffer
find regex ‘(</Row>)’ in lv_string.
IF sy-subrc = 0.
APPEND lv_string to lt_bufer.
flush.
else.
APPEND lv_string to lt_bufer.
ENDIF.

—————————————-старая версия———————————————
небольшая программа и последовательность шагов как выгрузить произвольный отчет в Excel.

Сам этим методом пользуюсь уже около 2-х лет, это модифицированный вариант того что нам принесли и показали, изначальное авторство неизвестно.

Недавно меня спросили как я делаю такие красивые отчеты, и я подумал что это будет полезно еще кому-нибудь.

работает на системах с поддержкой юникода.

Иногда нужно получить красивый отчет для бухгалтерии вроде такого

обычно образец этого отчета приходит в Excel.

открываем шаблон, и заменяем все переменные тексты переменными из программы, завернув их в $#$# например $#sy-datum$#

есть правило по одной переменной на ячейку, если нужно больше собираете заранее в 1-ну переменную и кладете ее в ячейку

первая ячейка каждой строчки должна содержать текст, если текст не нужен, тогда пробел.

в строке которую нужно размножить ставим $!$

играемся со шрифтами, форматом отображения и прочее.

у нас получается такой шаблон

ставим курсор в ячейку а1 и сохраняем как Таблица XML 2003 (*.xml)

полученный файл скармливаем программе Z_ASIKIDIN_TEMP, исходники в архиве, программа простая содержит только текст, запускаем выбираем файл жмем F8.

рядом с файлом появятся 2 файла: один %имя%.txt второй %имя%1.txt

нам нужен второй.

открываем копируем все в какой-нибудь инклюд.

иногда в ячейке много текста что он не помещается в одну строку редактора

в конце строки закрываем кавычку ставим точку, в начале следующей строки добавляем xml_simple ‘

в том месте где мы ставили $!$ будет длинный комментарий выделено красным, начало и конец строки выделено фиолетовым.

все это дело заворачиваем в loop

для ячеек содержащих дату меняем
perform to_utf CHANGING it_zaaqb-ERSDA .
на
perform date_convert CHANGING it_zaaqb-ERSDA .

в самом конце поменять

xml_download4.
на
xml_download5 ‘отчет.xls’.

или поменять это в генераторе.

когда нужно распечатать

if pa_print is not INITIAL.
include z_asikidin_report.
endif.

в самом начале нужно подключить 2 инклюда с макросами и переменными, или можно их слить в один

include ZBFI_RES_DEBT_uni. " unicode convert
include ZBFI_RES_DEBT_xml. " export to excel/xml

все отчет готов!
990 строчек кода написано.

исходники и рабочие примеры в архиве

Z_ASIKIDIN_XML — демо пример

инклюды необходимые для работы
ZBFI_RES_DEBT_UNI
ZBFI_RES_DEBT_XML

Генератор отчета
Z_ASIKIDIN_TEMP

сам отчет
Z_ASIKIDIN_REPORT

sample.rar
Description: Download
Filename: sample.rar
Filesize: 3.22 KB
Downloaded: 1454 Time(s)
zdev_xml.rar
Description: Download
Filename: zdev_xml.rar
Filesize: 43.62 KB
Downloaded: 1399 Time(s)

Сейчас пытаюсь испробовать на документе.

Скажите, а как сделать так, чтобы при пустых ячейках рамка не копировалась?
На рисунках лишняя рамка отмечена красным.

в sample.rar ни в программе ни в xml-ке ненашел строки ss:StyleID="s27"

Для примера sample.rar нужно после строки 165

Code:
REPLACE REGEX ‘(\$#(.*)\$#)’ in wa_bufer WITH lv_str3.

Добавить

Code:
IF <field> is initial.
replace ‘ss:StyleID="s22"’ in wa_bufer with ‘ss:StyleID="Default"’.
ENDIF.

Это хардкод, но работает, красивое решение позже. Можно дописать в шаблон свли стили.

не прокатил.
В отладчике менял ss:StyleID="s22" на ss:StyleID="Default"
тож не получается.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *