Как из 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 Участник соглашение по переменным: соглашение по заполнению шаблона: шаблон сохраняем как таблица xml 2003 загружаем шаблон, выбираем имя. в программе когда все переменные посчитаны вызвать форму
в таблице it_source находится сгенерированный xml документ, Z_TEST_EXPORT_TO_EXCE — имя шаблона. тестовый шаблон в приложении test.xml, рабочий легкоадоптируемый пример ниже, впримере показано как правильно выгрузить xml документ в кодировке utf-8 и избежать проблем с конвертацией. Генерировать xml отчеты на ABAP — это как генерировать html странички на PHP: нет в этом ничего страшного и интересного. парсер странно работает,и покорежил текст программы, прикладываю в приложении sample.rar types data *выбираем данные * генерируем XML * оперделяем кодировку IF sy-subrc <> 0. * выгружаем данные form export_to_excel TABLES it_source type tt_string using IV_OBJID TYPE W3OBJID . : KEY type WWWDATATAB LOOP AT lt_bufer INTO wa_bufer . find REGEX ‘(\$#(.*)\$#)’ in wa_bufer SUBMATCHES lv_str lv_str2. REPLACE lc_lt in lv_str2 WITH ‘<‘. ASSIGN (lv_str2) to <field>. REPLACE REGEX ‘(\$#(.*)\$#)’ in wa_bufer WITH lv_str3. APPEND wa_bufer to it_source. " if tabname defined — loop at table ASSIGN (lv_tabname) to <table>. LOOP AT <table> ASSIGNING <wa>. clear lv_tabname. " get key of object OBJ_NAME RELID = ‘MI’ PGMID = ‘R3TR’ OBJECT = ‘W3MI’ " get object " convert raw data to string " process template 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. " find table name " new row occured, process buffer "reach end of row, add last line to buffer and process buffer —————————————-старая версия——————————————— Сам этим методом пользуюсь уже около 2-х лет, это модифицированный вариант того что нам принесли и показали, изначальное авторство неизвестно. Недавно меня спросили как я делаю такие красивые отчеты, и я подумал что это будет полезно еще кому-нибудь. работает на системах с поддержкой юникода. Иногда нужно получить красивый отчет для бухгалтерии вроде такого обычно образец этого отчета приходит в Excel. открываем шаблон, и заменяем все переменные тексты переменными из программы, завернув их в $#$# например $#sy-datum$# есть правило по одной переменной на ячейку, если нужно больше собираете заранее в 1-ну переменную и кладете ее в ячейку первая ячейка каждой строчки должна содержать текст, если текст не нужен, тогда пробел. в строке которую нужно размножить ставим $!$ играемся со шрифтами, форматом отображения и прочее. у нас получается такой шаблон ставим курсор в ячейку а1 и сохраняем как Таблица XML 2003 (*.xml) полученный файл скармливаем программе Z_ASIKIDIN_TEMP, исходники в архиве, программа простая содержит только текст, запускаем выбираем файл жмем F8. рядом с файлом появятся 2 файла: один %имя%.txt второй %имя%1.txt нам нужен второй. открываем копируем все в какой-нибудь инклюд. иногда в ячейке много текста что он не помещается в одну строку редактора в конце строки закрываем кавычку ставим точку, в начале следующей строки добавляем xml_simple ‘ в том месте где мы ставили $!$ будет длинный комментарий выделено красным, начало и конец строки выделено фиолетовым. все это дело заворачиваем в loop для ячеек содержащих дату меняем в самом конце поменять xml_download4. или поменять это в генераторе. когда нужно распечатать if pa_print is not INITIAL. в самом начале нужно подключить 2 инклюда с макросами и переменными, или можно их слить в один include ZBFI_RES_DEBT_uni. " unicode convert все отчет готов! исходники и рабочие примеры в архиве Z_ASIKIDIN_XML — демо пример инклюды необходимые для работы Генератор отчета сам отчет
Сейчас пытаюсь испробовать на документе. Скажите, а как сделать так, чтобы при пустых ячейках рамка не копировалась? в sample.rar ни в программе ни в xml-ке ненашел строки ss:StyleID="s27" Для примера sample.rar нужно после строки 165
Добавить
Это хардкод, но работает, красивое решение позже. Можно дописать в шаблон свли стили. не прокатил. | ||||||||||||||||||||||||||||




