Добрый день всем. Нужна ваша помошь с выводом данных в Excel из опер запроса. Делаю пользовательский шаблон cus_sap_mm.xls. Формирую данные в ALV Grid, после этого вывожу в свой пользовательский шаблон. Данные выводятся, всё ок.
Однако мне нужно вывести данные, используя форматирование. То есть, к примеру, я хочу, чтобы первая строка на листе excel, в который выводятся данные, была выделена синим цветом и жирным шрифтом и т.д. Пробую изменять параметры ячеек Excel, то есть ставлю заливку первой строки синим цветом. Однако после вывода данных из ALV Grid в Excel я своего форматирования не вижу, параметры всех ячеек снова стали такими, какими было по умолчанию.
Читала в доках (нотах), что можно сначала изменить параметры в ALV, сохранить их в layout, и после этого выводить, тогда то форматирование, что будет указано в ALV, правильно выведется в экселе. Однако это не тот способ, что мне нужен, мне нужно, чтобы именно _шаблон_ содержал в себе нужное форматирование ячеек. Можно ли это как-нибудь сделать? С помощью макросов — получилось, а можно ли сделать как-нибудь без них? Если можно, то подскажите как. Если нельзя, то скажите, зачем вообще тогда придумали эти шаблоны, если ничего кроме макросов менять нельзя?
Довольно часто появляется необходимость выгрузить внутреннюю таблицу в MS Excel с расширением *.xlsx. Это обусловлено в том числе тем, что этот формат позволяет хранить >65536 строк.
На сегодняшний день в SAP помимо стандартных средств существует несколько Z-разработок (XLSX Workbench, abap2xlsx).
Стоит сказать, что из всех инструментов с которыми мне приходилось работать больше всего мне понравился XLSX Workbench.
Достоинств у него много: здесь и интуитивно понятный графический интерфейс, и большие функциональные возможности (без использования OLE). Например, легко можно получить документ в виде xstring, что очень востребовано. Кроме того, отличная документация с примерами.
Однако, в этой статье я хочу показать как выгрузить внутреннюю таблицу в файл *.xlsx с помощью другого инструмента — abap2xlsx.
Начнем.
Для начала проверьте, установлен ли данный инструмент в вашей системе.
Если нет, то его можно установить несколькими способами описанными здесь.
Далее, следуя принципу «Лучше один раз увидеть, чем сто раз услышать» сразу приведу пример программного кода.
Возможно, некоторые комментарии вам покажутся избыточными. И вы абсолютно правы. Но здесь и далее я стремлюсь к тому, чтобы код был понятен как можно большему количеству заинтересовавшихся данной статьей людей.
Результат работы:
Для лучшего понимания, рекомендую скопировать его «как есть» в тестовый отчет и запустить отладчик.
На этом все.
Спасибо за прочтение!
Бонус.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
1. Аннотация
Автор дает краткий обзор существующих методов создания печатных форм в Excel-совместимых форматах, а также знакомит читателя с инструментом XLSX Workbench посредством серии «пошаговых» примеров: от простого к сложному. Примеры демонстрируют реализацию элементов типовых печатных форм: Табличная часть, Изображение, Диаграмма, Иерархическая структура (дерево).
2. Введение
С выгрузкой данных в MS Excel-совместимый формат рано или поздно сталкивается каждый ABAP-разработчик, так как данный формат не теряет своей популярности у пользователей, и они довольно часто предпочитают Excel другим средствам — SmartForms и AdobeForms. На тему реализации Excel-форм уже накопилось огромное количество информации и наработок, и для каждой типовой задачи можно найти массу решений. Однако, у этого есть и обратная сторона — разнообразие способов реализации одной и той же задачи не способствует поддержанию порядка в этой части разработок и, как следствие, усложняет их сопровождение. Не претендуя на полноту списка, я изложу лишь наиболее часто встречаемые мной на проектах подходы к форматированной выгрузке данных в Excel.
Примечание. Инструмент SmartForms пришел на смену морально устаревшему SapScript, обладая гораздо более дружественным графическим интерфейсом и позволяя обходиться без программирования в 90% случаев. Ссылка по теме.
Примечание. Официальное название PDF-Based Print Forms считается более продвинутым и современным инструментом для создания форм, чем SmartForms. Является составной частью более крупного решения SAP Interactive Forms by Adobe. Ссылка по теме.
Как правило, выгрузка основывается на файле-шаблоне, хранимом в WEB-репозитарии и содержащем базовое форматирование результирующей формы. В тексте шаблона имеются особые метки, которые в runtime заменяются на значения, передаваемые из программы печати. Другие размеченные области шаблона могут дублироваться, удаляться и претерпевать изменения согласно логике, имплементированной в программе печати или в макросе VBA. Использование файла-шаблона позволяет, в случае необходимости, легко вносить изменения в формат отдельных ячеек и областей.
Технологии выгрузки:
-
Формирование файла исключительно средствами DOI / OLE / VBA в различных сочетаниях.
Традиционный стандартный набор низкоуровневых API Desktop office integration (DOI) позволяет сделать многое, а в сочетании с VBA — практически всё (разумеется, в рамках возможностей MS Excel). Но напрямую в программах печати эти API используется довольно редко. Чаще на их основе разрабатываются более удобные пользовательские решения для выгрузки форм. Передача данных из программы печати в целевые ячейки шаблона может быть реализована следующими способами (но не только ими):- Передача значений из программы печати непосредственно в целевые ячейки шаблона средствами DOI / OLE.
- Передача внутренних таблиц в шаблон средствами DOI в виде коллекции таблиц и последующий их разбор и форматирование VBA-макросом.
- Выгрузка внутренней таблицы в промежуточный CSV (или какой-либо другой) файл с последующей загрузкой его в шаблон, разбором и форматированием VBA-макросом. Как уже было сказано, главный плюс использования DOI / OLE / VBA — в абсолютной гибкости форматирования. Минусы же следующие:
- Требуются разрешения на запуск макросов (если используются).
- Невозможность работы в фоновом режиме.
- Загрузка локальной машины пользователя. Длительное формирование «тяжелого» файла (или большого числа файлов) может существенно замедлить или вовсе парализовать остальную работу пользователя.
-
Сборка файла в открытых форматах на стороне сервера приложений .
- Сборка файла в формате «Таблица XML 2003» (XMLSS). Технически этот формат представляет собой единый XML-файл, описывающий содержимое книги Excel. До появления формата «Open XML», формат «Таблица XML 2003» был единственной возможностью получения Excel-совместимой формы в фоновом режиме. Собственно, в этом заключается его главный плюс. Минусы же данного формата в том, что файл на выходе получается довольно «тяжелый» по сравнению с XLS или XLSX, а также, не поддерживает многие опции форматирования (такие как условное форматирование, диаграммы, рисунки и др.). Чаще всего такой файл получают посредством XSLT-трансформации (которая, кроме прочего, выполняет функцию шаблона). В этом случае, я бы дополнительным плюсом назвал использование только штатных средств (т.е. без использования различных Z-утилит). А дополнительным минусом — довольно кропотливый труд при внесении даже небольших изменений в исходное форматирование.
-
Сборка файла в формате «Open XML» (XLSX, XLSM). Технически этот формат представляет собой ZIP-архив, содержащий несколько XML-файлов, описывающих различные составляющие книги Excel. Кроме того, что данный формат современнее, чем XLS, существует возможность формирования его прямо на сервере приложений, без участия приложения MS Excel. Возможные средства реализации:
- Стандартные классы CL_XLSX_* находятся в пакете S_OOXML_XLSX. Как и DOI, они представляют собой низкоуровневые API, которые в исходном виде использовать непосредственно в программе печати весьма трудоемко (к тому же для их использования необходимо иметь базовые представления о спецификации формата Open XML). Таким образом, к этим API сама собой напрашивается пользовательская «обертка» для более комфортной работы.
- Хорошо известная пользовательская разработка западных коллег — набор классов для работы с XLSX и XLSM файлами. Данная разработка проще в использовании, чем, CL_XLSX_* , а также, поддерживает VBA-макросы (в случае с XLSM-файлом), что существенно расширяет её функциональность. Справедливости ради, стоит сказать, что иногда невозможно обойтись без постобработки файла средствами DOI / OLE / VBA. Дело в том, что некоторые вещи (такие как: контроль автоматических разрывов страниц; вставка итоговых строк по каждой печатной странице; настройка оптимальной высоты/ширины для объединенных ячеек; и др.) умеет делать только приложение MS Excel. Но, к счастью, такие требования к формам не слишком часты.
- Стандартные классы CL_XLSX_* находятся в пакете S_OOXML_XLSX. Как и DOI, они представляют собой низкоуровневые API, которые в исходном виде использовать непосредственно в программе печати весьма трудоемко (к тому же для их использования необходимо иметь базовые представления о спецификации формата Open XML). Таким образом, к этим API сама собой напрашивается пользовательская «обертка» для более комфортной работы.
Примечание. Desktop Office Integration (DOI) — набор ABAP-интерфейсов, позволяющих установить взаимодействие между ABAP-программой и офисными приложениями, установленными на локальной машине пользователя, посредством OLE2-интерфейса. Ссылка по теме.
Примечание. Формат XML Spreadsheet (XMLSS) описывает основное содержимое и форматирование книги. Однако, следующие функции не поддерживаются: Диаграммы, OLE-объекты, Рисунки и автофигуры, VBA-проекты, Группировка строк/столбцов. Ссылка по теме.
Примечание. Формат Office Open XML (так же известный как Open XML или OOXML) предназначен для большинства офисных документов (электронные таблицы, текст, презентации и т.д.) был изначально разработан Microsoft. Файл представляет собой ZIP-архив, содержащий некоторое количество XML-файлов («parts»). Также в ZIP-архиве могут содержаться медиафайлы, например, растровые изображения и др. Ссылка по теме.
Перечисленные подходы, в разной степени удобства использования, решают вопрос экспорта данных в Excel-формат. Но отчего их такое множество? И почему такого «разброда и шатания» не наблюдается для SmartForms или AdobeForms? По большей части не потому ли, что (вместо API-полуфабрикатов) для них изначально созданы удобные и самодостаточные среды разработки, позволяющие визуально конструировать структуру формы и настраивать все её опции? Этот риторический вопрос сподвиг меня к разработке визуального конструктора Excel-форм XLSX Workbench, с которым я и хотел бы вас познакомить в настоящей статье. Главное отличие XLSX Workbench от имеющихся на сегодняшний день решений в простоте и наглядности процесса разработки формы — знать ABAP и VBA при этом не обязательно, всё делается с помощью кликов мышью. Этот инструмент с легкостью позволяет создавать как простые, так и очень сложные (в том числе и полностью динамические) формы. В качестве дополнительного бонуса — возможность получения формы в фоновом режиме.
Примечание. XLSX Workbench — бесплатный и находящийся в открытом доступе инструмент для создания печатных форм в формате OpenXML (XLSX). Официальный сайт проекта.
Приведенные ниже (разделы 4-9) примеры базируются на стандартных таблицах из модели данных для обучения SAP Flight Model.
Примечание. Flight model — это набор объектов ABAP-словаря (таблиц, структур, типов) и программных компонентов, имеющих логическую взаимосвязь. Являются основой для многих стандартных обучающих примеров. Ссылка по теме.
3. Основные понятия в XLSX Workbench
Рис.1. Модель
Контекст служит для передачи данных между Программы печати и Формой (Рис.1). Контекстом может быть любая структура, табличный тип и даже элемент данных. Главное условие — это должен быть тип, объявленный в словаре данных. Проще говоря — заходим в SE11 и создаем табличный тип или структуру (либо берем уже имеющуюся) — это и будет контекст.
Программа печати (Рис.1). нужна только для того, чтобы заполнить данными контекст и вызвать Ф.М. ZXLWB_CALLFORM, передавая ему на вход этот контекст.
Форма (Рис.1). создается и редактируется в транзакции ZXLWB_WORKBENCH. Процесс разработки формы повторяет многие принципы разработки в SmartForms. Например, за основу взято представление структуры формуляра в виде иерархии компонентов. Форматирование итогового документа определяется сочетанием отдельных фрагментов шаблона (компонент «Паттерн»), а за передачу текста в ячейку документа отвечает компонент «Значение», который связан с Контекстом. Существуют и другие компоненты («Цикл», «Папка» и др.), с помощью которых возможно реализовать почти любое требование по форматированию.
4. Создание простейшей формы. Вывод полей: Исполнитель/ Телефон/ E-mail.
4.1. Контекст
В качестве контекста будем использовать структуру, объявленную в словаре данных. Зайдем в транзакцию SE11 и создадим структуру (тип данных) с наименованием ZXLWB_EXAMPLE1_CONTEXT (Рис.2). В структуру добавим три поля — все они имеют тип STRING:
- FULLNAME (Исполнитель)
- PHONE (Телефон)
После этого активируем созданную структуру.
Рис.2. Создание структуры
4.2. Формуляр
4.2.1. Создание и сохранение формуляра
Запустим транзакцию ZXLWB_WORKBENCH и создадим форму с наименованием, например, EXAMPLE1 (Рис.3):
Рис.3. Создадание формы
Сразу же после создания сохраним формуляр, нажав на кнопку с дискеткой и указав требуемый пакет для сохранения (Рис.4):
Рис.4. Сохранение формуляра
4.2.2. Разметка шаблона
В Excel-шаблоне, находящемся в правой части экрана, нарисуем следующее (Рис.5):
Рис.5. Разметка шаблона
4.2.3. Присвоение контекста формуляру
Для привязки контекста к формуляру необходимо выделить корневой узел Структуры формуляра и на вкладке «Свойства формуляра», в пункте «Наименование контекста» нажать кнопку с карандашом. На открывшемся popup-экране укажем ZXLWB_EXAMPLE1_CONTEXT . На предложение «создать структуру формуляра автоматически» отвечаем утвердительно, как показано на Рис.6:
Рис.6. Присвоение контекста и автоматическое создание структуры формуляра
В результате, будет автоматически создана такая структура, как показана на Рис.7:
Рис.7. Структура формуляра
4.2.4. Связь компонентов структуры формуляра с Excel-шаблоном
Теперь нам необходимо установить связь узлов дерева Структуры формуляра с областями Excel-шаблона. Схема связи представлена на Рис.8:
Рис.8. Схема связи компонентов с шаблоном
Сначала выполним связь, обозначенную на Рис.8 синей линией:
- Выделим в дереве Структуры формуляра узел с цветной клеткой (так обозначается компонент Паттерн).
- Затем, в Excel-шаблоне выделим диапазон ячеек A1:G7.
- Затем, во вкладке «Свойства компонента», в пункте «Область в шаблоне» нажмем кнопку с карандашом (Рис.9):
Рис.9. Связь Паттерна с шаблоном установлена
В результате этих трех несложных действий компонент Паттерн оказался связан с выделенной областью шаблона.
Заменим наименование и описание Паттерна на более понятное (Рис.10):
Рис.10. Смена наименования и описания Паттерна
Теперь выполним связь с шаблоном для оставшихся трех компонентов: FULLNAME, PHONE и EMAIL. Этот тип компонентов называется Значением и служит для передачи данных из одного поля контекста в одну ячейку Excel-формы. Принцип связывания этих компонентов с шаблоном точно такой же, как и для Паттерна (Рис.9) .
4.2.5. Активация формуляра
Активируем формуляр нажатием кнопки со «спичкой».
4.3. Программа печати
Программа печати включает в себя три этапа:
- Объявление контекста
- Заполнение контекста
- Вызов Ф.М.’ZXLWB_CALLFORM’
Создадим отчет (тип 1-Выполняемая программа) с наименованием, например, ZXLWB_EXAMPLE1 и вставим в него этот код (не забыв активировать) :
REPORT zxlwb_example1.
* объявили контекст
DATA gs_context TYPE zxlwb_example1_context .
* заполнили контекст
PERFORM fill_context .
* отобразили форму
*Вызов
CALL FUNCTION ‘ZXLWB_CALLFORM’
EXPORTING
iv_formname = ‘EXAMPLE1’
iv_context_ref = gs_context
EXCEPTIONS
OTHERS = 2.
IF sy-subrc NE 0 .
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF .
*&———————————————————————*
*& Form fill_context
*&———————————————————————*
* Заполнение контекста
*———————————————————————-*
FORM fill_context .
*=======================================================================
* 1) Исполнитель/ Телефон/ E-mail
*=======================================================================
DATA:
ls_address TYPE bapiaddr3 ,
lt_return TYPE STANDARD TABLE OF bapiret2 .
CALL FUNCTION ‘BAPI_USER_GET_DETAIL’
EXPORTING
username = sy-uname
IMPORTING
address = ls_address
TABLES
return = lt_return.
CONCATENATE ls_address-fullname ‘(‘ sy-uname ‘)’
INTO gs_context-fullname » —>> Исполнитель
SEPARATED BY space .
gs_context-phone = ls_address-tel1_numbr . » —>> Телефон
gs_context-email = ls_address-e_mail . » —>> E-mail
ENDFORM . «fill_context
4.4. Проверка результата
Запустим нашу программу печати ZXLWB_EXAMPLE1 (например, нажатием клавиши F8). Если мы всё сделали правильно, то увидим результат, показанный на Рис.11:
Рис.11. Печать отчёта
5. Вывод таблицы Авиакомпаний
5.1. Контекст
Добавим в наш контекст поле TABCARR с табличным типом TY_SCARR. Таким образом, мы добавили в контекст вложенную таблицу (Рис.12):
Рис.12. Добавление в контекст вложенной таблицы TABCARR
5.2. Формуляр
После того, как мы добавили новое поле в контекст, необходимо перезапустить транзакцию ZXLWB_WORKBENCH, для актуализации контекста в форме.
5.2.1. Разметка шаблона
Добавим в шаблон «серую строку» (Рис.13) под той областью, что мы разметили ранее.
Рис.13. Добавление «серой» строки в шаблон
5.2.2. Добавление компонента Цикл
Добавим Цикл ниже Паттерна (на одном уровне с ним). Для этого, выделим в дереве структуры вышестоящий узел SHEET и нажмем на кнопку «Создать компонент». Из появившегося списка выберем компонент Цикл. На следующем экране укажем его название и описание. После этого созданный компонент Цикл отобразится в дереве структуры (Рис.14)
Рис.14. Добавление компонента Цикл в дерево структуры
Теперь свяжем Цикл с таблицей TABCARR из контекста. Для этого во вкладке «Свойства компонента», в пункте «Связь с контекстом» нажмем кнопку с карандашом и в popup-списке выберем TABCARR (Рис.15):
Рис.15. Связываем Цикл с таблицей контекста
5.2.3. Добавление компонента Паттерн для строки таблицы.
Выделив узел Цикла в дереве структуры, нажмем кнопку «Создать компонент». Из появившегося списка выберем Паттерн и укажем его название и описание. После этого, созданный компонент Паттерн отобразится в дереве структуры (Рис.16):
Рис.16. Добавление компонента Паттерн для строки таблицы в дерево структуры
Свяжем добавленный Паттерн с областью в Excel-шаблоне. Для этого сначала выделим узел Паттерна в дереве, затем, выделим в шаблоне ячейки A8:G8, и после этого, во вкладке «Свойства компонента» в пункте «Область в шаблоне» нажмем на кнопку с карандашом. Связь с шаблоном установлена.
5.2.4. Добавление Значений для строки таблицы.
Выделив узел Паттерна строки в дереве структуры, нажмем кнопку «Создать компонент». В появившемся списке, дважды щелкнем на изображении точки с тремя стрелочками — так включается режим создания Значений путем выбора полей из контекста. В появившемся списке дважды щелкнем по полям CARRNAME и CURRCODE — слева них появится зеленая галочка. Нажмем кнопку «Создать» внизу списка, после этого созданные Значения отобразится в дереве структуры (и они уже будут иметь связь с контекстом), как это показано на Рис.17:
Рис.17. Добавление Значений в дерево структуры
Теперь остается только сопоставить созданные Значения с целевыми ячейками шаблона по схеме, показанной на Рис.18:
Рис.18. Схема связи Значений с целевыми ячейками шаблона
Для этого выделим узел компонента в дереве структуры, затем выделим целевую ячейку шаблона, после этого, во вкладке «Свойства компонента» в пункте «Область в шаблоне» нажмем кнопку с карандашом. Связь с шаблоном установлена.
5.2.5. Активация формуляра
Активируем формуляр нажатием кнопки со «спичкой».
5.3. Программа печати
Вставим в подпрограмму FILL_CONTEXT новые строчки кода (ниже заполнения полей Исполнитель/ Телефон/ E-mail):
*=======================================================================
* 2) Таблица авиакомпаний
*=======================================================================
SELECT *
INTO TABLE gs_context-tabcarr[]
FROM scarr .
5.4. Проверка результата
Запустим нашу программу печати ZXLWB_EXAMPLE1 и увидим такой результат, как на Рис.19:
Рис.19. Печать отчёта
6. Вывод футера с логотипом
Под таблицей выведем нижнюю часть формы, называемую футером, или «подвалом». В футер поместим картинку (логотип), которая будет загружаться в формуляр прямо из WEB-репозитария. Мы можем её видеть в транзакции SMW0 (Рис.20):
Рис.20. Объект логотипа в WEB-репозитарии
6.1. Контекст
Добавим в контекст новое поле LOGO с типом RAWSTRING (Рис.21):
Рис.21. Добавление поля в контекст
6.2. Формуляр
Перезапустим транзакцию ZXLWB_WORKBENCH, для актуализации контекста в форме.
6.2.1. Разметка шаблона
Добавим прямоугольную область, внутри которой будет располагаться логотип. Он будет занимать несколько объединенных ячеек в правом нижнем углу этой области (Рис.22):
Рис.22. Локализация логотипа в форме
6.2.2. Добавление компонентов Паттерна и Рисунка
Добавим Паттерн ниже Цикла (на одном уровне с ним). Для этого, выделим в дереве структуры вышестоящий узел SHEET и нажмем на кнопку «Создать компонент». Из появившегося списка выберем компонент Паттерн. На следующем экране укажем его название и описание. После этого созданный компонент Паттерн отобразится в дереве структуры (Рис.23):
Рис.23. Паттерн в дереве структуры
Для созданного Паттерна FOOTER создадим дочерний узел Рисунок. Выделим узел Паттерна в структуре формуляра и нажмем на кнопку «Создать компонент». Из появившегося списка выберем компонент Рисунок. На следующем экране укажем его название и описание. После этого созданный компонент отобразится в дереве структуры (Рис.24):
Рис.24. Рисунок в дереве структууры
Теперь необходимо сопоставить созданные Паттерн и Рисунок с областями шаблона по схеме, показанной на Рис.25:
Рис.25. Схема связи компонентов с шаблоном
Для этого выделим узел компонента в дереве структуры, затем выделим целевую область шаблона, после этого, во вкладке «Свойства компонента» в пункте «Область в шаблоне» нажмем кнопку с карандашом. Связь с шаблоном установлена.
Для компонента Рисунок дополнительно необходимо установить связь с
Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland
Зарегистрироваться
У вас уже есть учетная запись?
Войти
Рано или поздно каждый консультант сталкивается с задачей быстрой и эффективной обработки большого массива данных из системы. Предметная область тут неважна. Многие компании практически не используют современные аналитические решения на благо повседневной трудовой деятельности. Причин тому много, но сегодня речь о другом. Наиболее типичные ситуации, это сверка данных при миграции данных или выгрузка большого объема данных из системы с целью последующей обработки в MS Excel. В 99% случаев будут именно такие задачи.
Вроде бы что сложного в выгрузке данных из отчета в системе? Совершенно ничего, когда мы говорим о паре десятков или сотен строк. Если речь идет о десятках тысяч строк или сотен тысяч строк, то мировоззрение начинает меняться. Попробуйте в ваших системах запустить оперативный запрос с даты старта SAP по паре инфотипов. А потом все это выгрузите и нарисуйте несколько формул рядом.
Исходя из моего опыта, могу дать некоторые базовые советы.
Совет 1. Выгрузка в MS Excel может быть осуществлена множеством способов. Даже нажимая одну кнопочку выгрузки разные системы обрабатывают событие по-разному. В ALV отчетах есть две возможность выгрузить данные в файл.
Левая кнопочка зависимости от версии системы либо откроет MS Excel Inplace (то есть внутри системы откроется XLS файл). Очень неудобно, мелко, но достаточно для просмотра пары записей. Файл можно сохранить. В другом случае система спросит, в каком формате желаете выгрузить данные.
По умолчанию у всех стоит первый вариант — MHTML. И не дай вам чебурашке выгружать тысячи записей в этом формате. Система внутри готовит данные, потом запускает XLST трансформацию и вываливает все это в страшненький полу-HTML код. Это занимает очень много памяти на сервере и часто приводит к дампам. При открытии такого файла Excel наоборот производит конвертацию из XML файла в свой XLS формат, что, по сути, дублирует работу. Если выгружать сразу в Excel XLS/XLSX формате, то лишние действия не производятся, файл выгружается существенно быстрее.
Если вы нажимаете вторую кнопочку в панели инструментов, то открывается вот такое окно:
Здесь выбираем ‘Text with Tabs». Это единственный правильный вариант выгрузки данных без каких-либо преобразований. Это самый быстрый вариант. Данные вылетают пулей, ложатся в плоский текстовый файл и не жужжат. У подхода есть один недостаток — надо открыть файл ручками, удалить саповский кривой заголовок с названием отчета/транзакции и даты запуска. После этого такой файл легко импортируется в Excel/Access/MySQL/SQLite или еще куда. Сохраняется все оригинальное форматирование из базы данных. И это БЫСТРО, ОЧЕНЬ быстро.
Совет 2. Допустим вы открыли мегафайл. Сделали колонку с парой функций внутри и протянули на все тысячи строк. Все, «давай, до-свидания». Глупый Excel начнет проявлять клиенто-ориентированность и будет сразу все обсчитывать. Каждая новая колонка будет увеличивать время обработки данных. Чтобы избежать таких инсенуаций, нужно перед началом работы с файлом отключить автоматический обсчет формул. Это делается на закладке «Формулы». На английском это Calculation Options. После этого спокойно пишем формулы, по кнопочке F9 тестируем результат. Практикуемся на небольшом объеме данных. Когда все отладили, протягиваем, нажимаем F9 и идем за кофе. Результат будет достигнут в разы быстрее.
Совет 3. Если мы уже в Excel сделали много формул, а дальше хотим развивать мысль, то рекомендуется сделать копию файла и заменить все формулы на значения. Копируем колонку/строку и вставляем на саму себя с опцией «Как значения». Это заменит все формулы на уже посчитанные значения, а значит системе не нужно пересчитывать все миллионы комбинаций при каждом изменении данных или формул.
Совет 4. Если вам нужно что-то удалить на больших данных, отфильтровать и удалить, то всегда сначала сортируйте данные, а потом включайте фильтр или производите удаление. На сортированных данных фильтрация и удаления происходят раза в два быстрее.
Совет 5. Если вам нужно обрабатывать всякие меппинги, справочники, то выгружать данные нужно по второму варианту из совета 2 в текстовый файл. Это сохранит все форматирование «как было». Плюс, при импорте данных выделите все столбцы и укажите тип «Текст». Это запретит Excel думать и преобразовывать данные на свой манер. Так, для справочника значение «01» останется как «01», а не 1. При сравнениях это очень сильно вредит.
Совет 6. Ключевые вещи, которые должен знать каждый консультант: Pivot table, INDEX, MATCH, VLOOKUP, SUMIF, IFNA, IF, VALUE, REPLACE, Named Ranges, Data Validation, Data Analyses.
Содержание
- Руководство пользователя по внесению изменений в шаблоны MS Excel
- Назначение
- Выгрузка шаблона
- Загрузка шаблона
- Внесение изменений
- Добавить комментарий Отменить ответ
- ABAP2XLSX Чтение шаблона из SMW0. Копирование Листов. Использование сохраненных стилей.
- Блог ABAP YouCoder
- Селекционный экран ABAP для выбора файла
- Средство поиска ABAP для файла
- Код ABAP программы загрузки Excel файла
- Определяю тип для внутренней таблицы результата
- ФМ ALSM_EXCEL_TO_INTERNAL_TABLE
- Обработка результата загрузки данных из Excel
- How to export excel file with template
- Assigned Tags
- Русские Блоги
- SAP EXCEL выгрузка и загрузка
Руководство пользователя по внесению изменений в шаблоны MS Excel
по внесению изменений в шаблоны выходных документов, хранящихся в репозитории бизнес-объектов в формате MS Excel (.xls)
Назначение
Программа печати выходного документа в формате MS Excel (.xls) состоит из двух частей – собственно программы печати, написанной на языке программирования ABAP/4, и шаблона выходного документа, созданного в MS Excel и помещённого в репозиторий бизнес-объектов системы SAP ERP.
Назначением программы печати является сбор и обработка актуальных бизнес-данных, передача их в шаблон и вывод заполненного шаблона.
Назначением шаблона является представление обработанных данных в виде и формате, необходимом Пользователю. При этом могут использоваться все доступные средства ПО, в формате которого создан шаблон – форматирование текста, создание таблиц, применение макросов и предустановка свойств для элементов шаблона (ячеек – в случае шаблона, подготовленного в MS Excel).
При необходимости внесения изменений в шаблон эти изменения могут быть выполнены опытным Пользователем самостоятельно, без участия разработчика/консультанта. Данное Руководство поясняет необходимый порядок действий для выполнения этой задачи.
При этом у Пользователя должны присутствовать соответствующие полномочия на изменение бизнес-объектов.
Выгрузка шаблона
Для выгрузки шаблона Пользователю необходимо выполнить транзакцию SMW0, и на первом экране выбрать вариант выбора «Двоичные данные для WebRFC-приложений»:
Далее перейти ко второму экрану выбора, на котором ограничить выборку из репозитория бизнес-объектов по начальным символам имени объекта (все пользовательские разработки в системе SAP ERP начинаются с Z):
После нажатия на кнопку «Выполнить» (F8) Система произведёт отбор удовлетворяющих заданному пользователем условию объектов. Пользователю необходимо выделить желаемый объект и нажать на кнопку «Экспортировать»:
Система предложит сохранить файл, присвоенный объекту, в произвольное место на рабочей станции пользователя.
Загрузка шаблона
Загрузка шаблона в систему SAP ERP производится аналогичным образом через список бизнес-объектов посредством выбора объекта и нажатия на кнопку «Импортировать»:
Внесение изменений
Внесение изменений в выгруженный шаблон производится обычным для ПО MS Excel образом. После внесения изменений шаблон необходимо загрузить в систему описанным выше способом.
Отдельного пояснения требует механизм вывода данных в шаблон.
Рассмотрим этот механизм на примере шаблона, разработанного для печати выходного документа «Акт приема – передачи выполненных работ».
Вывод данных из программы печати, разработанной на языке ABAP/4 в шаблон производится посредством подстановки подготовленных данных на место предопределённых разработчиком меток, для удобства пользования имеющих вид [метка]:
При необходимости пользователь может изменить расположение этих меток, определяя тем самым их положение на распечатываемом выходном документе.
Добавить комментарий Отменить ответ
Для отправки комментария вам необходимо авторизоваться.
Источник
ABAP2XLSX Чтение шаблона из SMW0. Копирование Листов. Использование сохраненных стилей.
В российских проектах для выгрузки в EXCEL применяется разработка ZWWW в большинстве случаев. Но она имеет несколько проблем как с быстродействием, так и с тем, что используется технология OLE. Основное неудобство на мой взгляд, это не возможность получить документ в фоне, и, например, сразу отправить его как вложение в письме и т.д.
Данную проблему можно решить используя другую разработку под названием ABAP2XLSX. Однако, из-за редкого использования многие не считают, что применяя ее невозможно использовать ранее сохраненные шаблоны. Это не так.
Рассмотрим небольшой пример в котором получим шаблон из репозитория состоящего из одного листа:
1. Скопируем этот лист со всем оформлением в новый.
2. Сохраним документ с двумя листами на локальный компьютер.
Все это делается уже готовыми методами, кроме создания копии листа. Поэтому для начала сделаем новый класс, унаследованный от исходного zcl_excel.
Нам потребуется создать один новый метод. Назовем его COPY_WORKSHEET.
Реализация очень проста:
Создаем страницу;
Kлонируем Страницу, которую подаем на вход метода как образец;
Прописываем новую страницу в документ.
Источник
Блог ABAP YouCoder
ABAP программа загрузки данных из EXCEL в SAP систему. Разберу на примере загрузку Excel файла, проверку и преобразование данных, полученных при загрузке ABAP.
Это полезная и часто используемая задача.
Рассмотрим один из вариантов загрузки данных из Excel на примере программы ABAP. Подробно разберу каждый блок программы для лучшего понимания. Ссылку на файл Excel для тестирования данной программы приведу в конце данной статьи.
Селекционный экран ABAP для выбора файла
Создаю селекционный экран ABAP на который добавлю одно поле для выбора файла из которого будут загружаться данные.
Средство поиска ABAP для файла
Так же в этой части кода добавляю средство поиска ABAP для поля файла через использование события AT SELECTION-SCREEN ON VALUE-REQUEST.
Код ABAP программы загрузки Excel файла
Определяю тип для внутренней таблицы результата
Я определил локальный тип структуры результата для большей наглядности в статье, но на его месте может быть и тип ABAP словаря.
Внутренняя таблица lt_sflight это таблица в которую будет помещён итоговый уже преобразованный результат загрузки. А таблица lt_intern это внутренняя таблица abap в которую изначально будут помещены данные из Excel для дальнейшей обработки.
ФМ ALSM_EXCEL_TO_INTERNAL_TABLE
Сама загрузка происходит при вызове функционального метода ALSM_EXCEL_TO_INTERNAL_TABLE, разберём подробно его параметры:
- filename – путь к файлу Excel. Использование конструкции CONV в этом случае преобразует параметр p_file к нужному типу.
- i_begin_col – номер колонки с которой начинать загрузку
- i_begin_row – номер строки с которой начинаем загрузку. В нашем случае установил значение 2 так как мне не нужно обрабатывать первую строку заголовка.
- i_end_col – сколько колонок нам нужно анализировать при загрузке
- i_end_row – сколько записей максимум берётся для анализа.
- intern – внутренняя таблица в которую будут загружаться данные из файла.
Обработка результата загрузки данных из Excel
С использованием конструкции нового синтаксиса LOOP AT GROUP BY обходим таблицу сгруппировав её по столбцу row, в котором расположен номер строки. И после обработки всей группы с одинаковым номером строки мы добавляем запись в таблицу результата и переходим к следующей группе.
Более подробно загрузка и обработка данных после разбирается в видео и не забывайте подписаться на мой канал YouCoder.
Источник
How to export excel file with template
Sometimes we may need to export a document in the form of a spreadsheet (MS Excel).
But often the problem of the automatic display by MS Excel.
Before export the data. we can create MS Excel templates and upload to SAP then run template later.
1) Prepare the MS Excel template
2) Upload to SAP with transaction OAOR
Class Name -> SOFFICEINTEGRATION
3) Click tab Create then expand all and double click to Table template
4) Chose MS Excel Template
5) Fill Description (Use in ABAP Program)
6) Check MS Excel template
perform genarate_excel_with_template tables lt_excel
form genarate_excel_with_template tables pt_excel type standard table
using pv_template type bds_propva
pv_file type localfile .
data : l_iref_template type ref to cl_bds_document_set ,
l_oref_container type ref to cl_gui_custom_container ,
l_iref_control type ref to i_oi_container_control ,
l_iref_error type ref to i_oi_error ,
l_iref_document type ref to i_oi_document_proxy ,
l_iref_spreadsheet type ref to i_oi_spreadsheet ,
l_retcode type soi_ret_string .
data : lt_signature type sbdst_signature ,
lw_signature type bapisignat ,
lt_uri type sbdst_uri ,
lw_uri type bapiuri ,
lt_sheet type soi_sheets_table ,
lw_sheet type soi_sheets .
data : lt_fields type standard table of rfc_fields ,
lv_last_row type i ,
lv_last_col type i .
call method c_oi_container_control_creator => get_container_control
check l_retcode = c_oi_errors => ret_ok .
call method l_iref_control -> init_control
check l_retcode = c_oi_errors => ret_ok .
create object l_iref_template .
lw_signature – prop_name = ‘DESCRIPTION’ .
lw_signature – prop_value = pv_template .
append lw_signature to lt_signature .
call method l_iref_template -> get_with_url
read table lt_uri into lw_uri index 1 .
check sy – subrc = 0 .
call method l_iref_control -> get_document_proxy
check l_retcode = c_oi_errors => ret_ok .
call method l_iref_document -> open_document
document_url = lw_uri – uri
check l_retcode = c_oi_errors => ret_ok .
call method l_iref_document -> get_spreadsheet_interface
call method l_iref_spreadsheet -> get_sheets
check l_iref_error -> error_code = c_oi_errors => ret_ok .
read table lt_sheet into lw_sheet index 1 .
check sy – subrc = 0 .
call method l_iref_spreadsheet -> select_sheet
name = lw_sheet – sheet_name
check l_iref_error -> error_code = c_oi_errors => ret_ok .
call function ‘DP_GET_FIELDS_FROM_TABLE’
lv_last_row = lines ( pt_excel ) .
lv_last_col = lines ( lt_fields ) .
call method l_iref_spreadsheet -> set_selection
call method l_iref_spreadsheet -> insert_range
call method l_iref_spreadsheet -> insert_one_table
call method l_iref_document -> save_as
call method l_iref_document -> release_document
call method l_iref_control -> release_all_documents .
call method l_iref_control -> destroy_control .
message ‘Generate Excel file’ type ‘S’ .
Assigned Tags
Very Much Helpful Document ℹ , Thanks For Sharing With Screen Shots 🙂 🙂 .
Reagrds,
Seshu.P
This article looks interesting, I’m not an SAP ABAP developer, just a SAP user that specifies new functions and tools for our SAP .
I have one question that seems like it may be related to this somehow.
Our development team has exported an excel with many lines for the user, the idea is that the user will modify some of the values in that excel then upload that excel back into SAP to update those new values in SAP. that works OK.
my question is, Is it possible to export an excel that already includes working formulas in the excel.
e.g. if the exported excel contains a column with Quantity and user inputs a Price in each cell in excel, then if such formualrs are actively working in the excel then it could immediately calculate the total amount = QTY x Price and show this value in the excel before the user uploads the new price data to SAP.
The idea is, that this would allow the user to do some basic and easy sanity checking on the data before uploading
Of course the user could add in the formulas himself after the download but this is more tricky, because the real formulas used are quite complicated and the users are, lets say, very busy with other tasks and not skilled with writing excel formulas
. any ideas that I could pass on to our development team, so far they haven’t found a way to add in working formulas ?
Thanks
Источник
Русские Блоги
SAP EXCEL выгрузка и загрузка
Некоторое время назад я создал программу для загрузки данных шаблона EXCEL в SAP и загрузки данных внутренней таблицы в EXCEL. Из-за сетевых причин, когда объем данных относительно велик, при использовании OLE для записи данных одна за другой скорость будет ниже, поэтому сначала скопируйте данные внутренней таблицы в буфер обмена, а затем вставьте их непосредственно в EXCEL, скорость будет выше. , Позвольте мне рассказать о методе ниже:
1. Сначала создайте шаблон данных EXCEL и загрузите его на сервер с SMW0.
Стиль шаблона EXCEL выглядит следующим образом:
2. Определение данных:
DATA : BEGIN OF header,
doc_date LIKE bapi_incinv_create_header — doc_date , «Ваучер Дата
pstng_date LIKE bapi_incinv_create_header — pstng_date , «Дата публикации
gross_amount LIKE invfo — wrbtr , «bapi_incinv_create_header-gross_amount», общая сумма счета в валюте ваучера
item_amount LIKE invfo — wmwst , «bapi_incinv_create_gl_account-item_amount», сумма налога
gl_account LIKE bapi_incinv_create_gl_account — gl_account , «Налоговый учет
payee_payer LIKE bapi_incinv_create_header — payee_payer , «Счет-вечеринка
item_text LIKE bapi_incinv_create_header — item_text , «Текст позиции
header_txt LIKE bapi_incinv_create_header — header_txt , «Текст заголовка
ref_doc_no LIKE bapi_incinv_create_header — ref_doc_no , «номер квитанции
pmnttrms LIKE bapi_incinv_create_header — pmnttrms , «условия оплаты
currency LIKE bapi_incinv_create_header — currency , «Код валюты
del_costs_taxc LIKE bapi_incinv_create_header — del_costs_taxc , «Налоговый кодекс
db_cr_ind LIKE bapi_incinv_create_gl_account — db_cr_ind , «Налоговый кредит логотип
blance TYPE rm08m — differenz , «Баланс
name12 TYPE zname12 , Описание поставщика
END OF header.
DATA : BEGIN OF item OCCURS 0 ,
ebeln LIKE ekpo — ebeln ,
ebelp LIKE ekpo — ebelp ,
matnr LIKE ekpo — matnr ,
maktx LIKE makt — maktx ,
meins LIKE ekpo — meins ,
menge LIKE ekbe — menge ,
wrbtr LIKE ekbe — wrbtr , «Количество
mwskz LIKE ekpo — mwskz , «Налоговый кодекс
selct ( 1 ) TYPE c ,
END OF item .
TYPE-POOLS : ole2 .
DATA : gv_excel_obj TYPE ole2_object ,
gv_workbook_obj TYPE ole2_object ,
gv_sheet_obj TYPE ole2_object .
DATA : gv_fname LIKE rlgrap — filename ,
gv_filename TYPE string ,
gv_icount TYPE i ,
gv_irow TYPE i .
DATA : gv_separator TYPE c .
FIELD-SYMBOLS : LIKE LINE OF item ,
TYPE ANY .
DATA : gt_excel ( 4096 ) OCCURS 0 WITH HEADER LINE .
TYPE-POOLS truxs .
DATA xltab TYPE truxs_t_text_data .
DATA : BEGIN OF gt_upload OCCURS 0 ,
cola ( 20 ) ,
colb ( 40 ) ,
colc ( 20 ) ,
cold ( 40 ) ,
cole ( 20 ) ,
colf ( 20 ) ,
colg ( 20 ) ,
colh ( 10 ) .
DATA : END OF gt_upload .
DATA : gv_file LIKE rlgrap — filename .
3. Подпрограмма DOWNLOAD_EXCEL
**** Получить файл шаблона и путь
PERFORM temp_excel_get CHANGING gv_fname .
**** Генерация файлов с шаблонами
PERFORM open_excel_file USING gv_excel_obj
gv_workbook_obj
gv_sheet_obj
gv_fname
‘0’ .
**** Заполнить шаблон
PERFORM write_header .
PERFORM write_item USING gv_excel_obj
gv_sheet_obj .
PERFORM save_close_excel USING gv_excel_obj
gv_workbook_obj
gv_sheet_obj .
MESSAGE ‘ Сохранено! TYPE ‘I’ .
DATA : l_objdata LIKE wwwdatatab ,
l_destination LIKE rlgrap — filename ,
l_rc LIKE sy — subrc ,
l_errtxt TYPE string .
SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF l_objdata
WHERE srtf2 = 0
AND relid = ‘MI’
AND objid = ‘ZTEST_003’ . «Вот название шаблона EXCEL
l_destination = ’D: Template.XLS ‘ Msgstr «Скачать путь к шаблону
* Проверьте, существует ли указанный файл шаблона в таблице wwwdata
IF sy — subrc NE 0 OR l_objdata — objid = space . «Если его не существует, выведите сообщение об ошибке
CONCATENATE «Шаблон» ‘не существует’ INTO l_errtxt .
MESSAGE l_errtxt TYPE ‘I’ .
EXIT .
ENDIF .
* Если он существует, вызовите функцию DOWNLOAD_WEB_OBJECT, чтобы загрузить шаблон в путь
CALL FUNCTION ‘DOWNLOAD_WEB_OBJECT’
EXPORTING
key = l_objdata
destination = l_destination
IMPORTING
rc = l_rc .
IF l_rc NE 0 .
CONCATENATE ‘Файл шаблона:’ l_destination ‘Ошибка загрузки!’ INTO l_errtxt .
MESSAGE l_errtxt TYPE ‘I’ .
EXIT .
ENDIF .
ENDFORM . » TEMP_EXCEL_GET
*&———————————————————————*
*& Form open_excel_file
*&———————————————————————*
FORM open_excel_file USING p_excel
p_workbook
p_sheet
p_fname
p_visible .
CREATE OBJECT p_excel ‘Excel.Application’ .
IF sy — subrc NE 0 .
gv_flag = ‘N’ .
MESSAGE i796 ( f9 ) WITH «Невозможно создать объект Excel» .
EXIT .
ENDIF .
CALL METHOD OF p_excel ‘Workbooks’ = p_workbook .
CALL METHOD OF p_workbook ‘Open’ = p_workbook
EXPORTING #1 = p_fname .
IF sy — subrc NE 0 .
gv_flag = ‘N’ .
MESSAGE i796 ( f9 ) WITH «Ошибка открытия файла» .
EXIT .
ENDIF .
SET PROPERTY OF p_excel ‘Visible’ = p_visible .
CALL METHOD OF p_workbook ‘Sheets’ = p_sheet
EXPORTING #1 = 1 .
* SET PROPERTY OF lcobj_sheet ‘name’ = sheetname.
ENDFORM . » OPEN_EXCEL_FILE
*&———————————————————————*
*& Form WRITE_HEADER
*&———————————————————————*
FORM write_header .
DATA : l_cell TYPE ole2_object .
* Дата счета
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 1 «Линия 1
#2 = 2 . «Колонка Б
SET PROPERTY OF l_cell ‘Value’ = header — doc_date .
* Дата публикации
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 2
#2 = 2 .
SET PROPERTY OF l_cell ‘Value’ = header — pstng_date .
*номер квитанции
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 3
#2 = 2 .
SET PROPERTY OF l_cell ‘Value’ = header — ref_doc_no .
*условия оплаты
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 4
#2 = 2 .
SET PROPERTY OF l_cell ‘Value’ = header — pmnttrms .
*валюта
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 5
#2 = 2 .
SET PROPERTY OF l_cell ‘Value’ = header — currency .
* Текст заголовка
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 6
#2 = 2 .
SET PROPERTY OF l_cell ‘Value’ = header — header_txt .
* Текст позиции
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 7
#2 = 2 .
SET PROPERTY OF l_cell ‘Value’ = header — item_text .
* Общая сумма счета
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 1
#2 = ‘E’ .
SET PROPERTY OF l_cell ‘Value’ = header — gross_amount .
* налог
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 2
#2 = ‘E’ .
SET PROPERTY OF l_cell ‘Value’ = header — item_amount .
*Налоговый кодекс
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 3
#2 = ‘E’ .
SET PROPERTY OF l_cell ‘Value’ = header — del_costs_taxc .
* Счет-фактура
CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
EXPORTING #1 = 4
#2 = ‘E’ .
SET PROPERTY OF l_cell ‘Value’ = header — payee_payer .
ENDFORM . » WRITE_HEADER
*&———————————————————————*
*& Form WRITE_ITEM
*&———————————————————————*
FORM write_item USING p_excel
p_sheet .
* FIELD-SYMBOLS: TYPE ANY.
* DATA: lv_rows TYPE i,
* lv_cols TYPE i.
* DATA: l_cell TYPE ole2_object.
*
* Lv_rows = 9. 9. ”” ”” ”” ”” ”” ”” ”” ”” ”” ”” началось со строки 10
* LOOP AT item WHERE selct = ‘X’.
* lv_cols = 1.
* DO 8 TIMES.
* ASSIGN COMPONENT sy-index OF STRUCTURE item TO .
* CALL METHOD OF gv_excel_obj ‘Cells’ = l_cell
* EXPORTING #1 = lv_rows
* #2 = lv_cols.
* SET PROPERTY OF l_cell ‘Value’ = .
* lv_cols = lv_cols + 1.
* ENDDO.
* lv_rows = lv_rows + 1.
* ENDLOOP.
DATA : lv_index TYPE i .
DATA : lv_str ( 512 ) .
gv_separator = cl_abap_char_utilities => horizontal_tab .
CLEAR gt_excel .
REFRESH gt_excel .
LOOP AT item ASSIGNING .
lv_index = 0 .
DO 8 TIMES .
lv_index = lv_index + 1 .
ASSIGN COMPONENT lv_index OF STRUCTURE TO .
IF sy — subrc <> 0 .
EXIT .
ENDIF .
CLEAR lv_str .
WRITE TO lv_str LEFT-JUSTIFIED .
CONDENSE lv_str .
IF lv_index = 1 .
gt_excel = lv_str .
ELSE .
CONCATENATE gt_excel lv_str INTO gt_excel SEPARATED BY gv_separator .
ENDIF .
ENDDO .
APPEND gt_excel .
CLEAR gt_excel .
ENDLOOP .
* Введите данные в буфер обмена одновременно и скопируйте в EXCEL
*export data to clipboard
DATA : lv_ret TYPE i .
CALL METHOD cl_gui_frontend_services => clipboard_export
IMPORTING
data = gt_excel[]
CHANGING
rc = lv_ret .
DATA : ls_cell TYPE ole2_object .
CALL METHOD OF p_excel ‘RANGE’ = ls_cell
EXPORTING
#1 = ‘A9’ .
* Paste data from clipboard
CALL METHOD OF ls_cell ‘Select’ .
CALL METHOD OF p_sheet ‘Paste’ .
*&———————————————————————*
*& Form SAVE_CLOSE_EXCEL
*&———————————————————————*
FORM save_close_excel USING p_excel
p_workbook
p_sheet .
SET PROPERTY OF p_excel ‘DisplayAlerts’ = 0 .
CALL METHOD OF p_excel ‘Save’ .
CALL METHOD OF p_workbook ‘CLOSE’ .
CALL METHOD OF p_excel ‘QUIT’ .
ENDFORM . » SAVE_CLOSE_EXCEL
4. Подпрограмма UPDATE_EXCEL
PERFORM get_pc_fieldname .
PERFORM update_excel .
PERFORM excel_check .
*&———————————————————————*
*& Form GET_PC_FIELDNAME
*&———————————————————————*
FORM get_pc_fieldname .
CALL FUNCTION ‘WS_FILENAME_GET’
EXPORTING
* mask = ‘,*.XLS ,*.XLS.’
mode = ‘0’
title = ‘Get the file name’
IMPORTING
filename = gv_file
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5 .
ENDFORM . » GET_PC_FIELDNAME
*&———————————————————————*
*& Form UPDATE_EXCEL
*&———————————————————————*
FORM update_excel .
REFRESH gt_upload .
CALL FUNCTION ‘TEXT_CONVERT_XLS_TO_SAP’
EXPORTING
* i_line_header = ‘X’
i_tab_raw_data = xltab
i_filename = gv_file
TABLES
i_tab_converted_data = gt_upload
EXCEPTIONS
conversion_failed = 1
OTHERS = 2 .
IF gt_upload[] IS INITIAL .
MESSAGE «Нет данных, загруженных в таблицу EXCEL» TYPE ‘I’ .
EXIT .
ENDIF .
ENDFORM . » UPDATE_EXCEL
Источник