Еще один способ выгрузки, со своими плюсами и минусами, подробно описано тут:
работа с сервисом бизнес-документов http://abaphr.ru/bds_oaor/
работа с шаблонами бизнес-документов из ABAP http://abaphr.ru/bds_aba/
Я только дополню более подробно сам момент, выгрузки внутренней таблицы в эксель форму.
Предположим, что все, что описано в контексте этой статьи, сделано, создан бизнес-документ, выбран тот документ, который нам нужен, выполнено его открытие, выполнена инициализация интерфейса. Остается лишь перенести внутреннюю таблицу в эксель.
В первую очередь, в шаблоне эксель, необходимо, присвоить имя диапазону ячеек, для дальнейшей работы с ним. Диапазон будет расширяться динамический, в зависимости от количества выводимых столбцов и значений, но начинаться будет всегда на той строке, где он стоит изначально. На рисунке область диапазона выделена серым цветом, и ей присвоено имя «table1».
Далее, я создаю подпрограмму в блоке инициализация интерфейса.
if not has is initial.
call method document->get_spreadsheet_interface
importing
sheet_interface = handle.
perform fill_exl_tab using lt_outtab.
endif.
importing
sheet_interface = handle.
perform fill_exl_tab using lt_outtab.
endif.
lt_outtab эта наша внутренняя таблица, данные которой необходимо перенести в excel.
Создаю простейший макрос для заполнения таблицы сont, тип которой определен ранее как soi_generic_table.
define fill_cont.
clear wa_cont.
clear wa_cont.
"тут интуитивно все понятно, но все же пропишу
&2 = &2 + 1 "При каждом входе наращиваем значение, т.к. каждая последующая запись, в одной строке эксель формы, должна быть записана в новую ячейку
wa_cont-row = &1. "Строка в эксель форме
wa_cont-column = &2. "Колонка в эксель форме
wa_cont-value = &3. "Значение в ячейке, в эксель форме
append wa_cont to cont.
end-of-definition.
&2 = &2 + 1 "При каждом входе наращиваем значение, т.к. каждая последующая запись, в одной строке эксель формы, должна быть записана в новую ячейку
wa_cont-row = &1. "Строка в эксель форме
wa_cont-column = &2. "Колонка в эксель форме
wa_cont-value = &3. "Значение в ячейке, в эксель форме
append wa_cont to cont.
end-of-definition.
Далее, в подпрограмме fill_exl_tab, запускаем цикл по выходной таблице, используя созданный макрос.
loop at lt_outtab into wa_ottab.
add 1 to s_tbx. "Наращиваем счетчик по строкам
clear: column. "Сбрасываем счетчик по колонкам
clear: column. "Сбрасываем счетчик по колонкам
fill_cont:
s_tbx column wa_ottab-zplanz ,
s_tbx column wa_ottab-gjahr ,
s_tbx column wa_ottab-zfact ,
s_tbx column wa_ottab-zdatadem ,
s_tbx column wa_ottab-diam ,
s_tbx column wa_ottab-wall .
s_tbx column wa_ottab-zplanz ,
s_tbx column wa_ottab-gjahr ,
s_tbx column wa_ottab-zfact ,
s_tbx column wa_ottab-zdatadem ,
s_tbx column wa_ottab-diam ,
s_tbx column wa_ottab-wall .
endloop.
Далее, меняем диапазон в зависимости от количества записей в выгружаемой таблице.
call method handle->change_range
exporting
rangename = 'table1' "имя диапазона в эксель форме
rows = lines( lt_outtab ) "количество строк
columns = 6. "количество столбцов
exporting
rangename = 'table1' "имя диапазона в эксель форме
rows = lines( lt_outtab ) "количество строк
columns = 6. "количество столбцов
Этими же значениями заполняем таблицу диапазона ran определенную ранее как soi_range_list
rangei-name = 'table1'.
rangei-rows = lines( lt_outtab ).
rangei-columns = 6.
append rangei to ran.
rangei-rows = lines( lt_outtab ).
rangei-columns = 6.
append rangei to ran.
Переносим данные в ексель форму.
call method handle->set_ranges_data
exporting
ranges = ran
contents = cont.
exporting
ranges = ran
contents = cont.
И еще один момент. Если делать
выгрузку без запуска основного отчета, то можно заметить, не вооруженным
глазом, что после того как выгрузятся данные, excel-файл закрывается. Что бы
этого не произошло, необходимо следом за выгрузкой вывести какое-либо
информационное окно.