Первый вариант
- Наследуемся от класса cl_gui_alv_grid
 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283CLASS lcl_alv DEFINITION INHERITING FROM cl_gui_alv_grid.PUBLIC SECTION.METHODS:constructor,export_to_excelIMPORTINGVALUE(it_data) TYPE ANY TABLE,create_fcatIMPORTINGit_data TYPE ANY TABLERETURNING VALUE(rt_fcat) TYPE lvc_t_fcat.ENDCLASS.CLASS lcl_alv IMPLEMENTATION.METHOD constructor."Создаем фиктивный контейнер, т.к. нам не нужно, чтобы ALV где либо отображалсяDATA lo_dummy_container TYPE REF TO cl_gui_custom_container.CREATE OBJECT lo_dummy_containerEXPORTINGcontainer_name = spaceEXCEPTIONScntl_error = 1cntl_system_error = 2create_error = 3lifetime_error = 4lifetime_dynpro_dynpro_link = 5OTHERS = 6.CHECK sy-subrc = 0."Передаем контейнер в конструктор суперклассаsuper->constructor(EXPORTINGi_appl_events = abap_truei_parent = lo_dummy_containerEXCEPTIONSerror_cntl_create = 1error_cntl_init = 2error_cntl_link = 3error_dp_create = 4OTHERS = 5).CHECK sy-subrc = 0.ENDMETHOD.METHOD export_to_excel."Вызываем метод для выгрузки"Он реагирует на код функции, поэтому устанавливаем нужныйsy-ucomm = mc_fc_call_xxl.fcode_bouncer( ).ENDMETHOD.METHOD create_fcat."Формирование каталога полей для произвольной таблицыDATA lo_table TYPE REF TO data.TRY.CREATE DATA lo_table LIKE it_data.ASSIGN lo_table->* TO FIELD-SYMBOL(<lt_table>).cl_salv_table=>factory( IMPORTINGr_salv_table = DATA(lo_salv_table)CHANGINGt_table = <lt_table> ).rt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(r_columns = lo_salv_table->get_columns( )r_aggregations = lo_salv_table->get_aggregations( )).CATCH cx_root.ENDTRY.ENDMETHOD.ENDCLASS.
- Создаем ФМ для выгрузки в excel произвольной таблицы
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | FUNCTION zexport_to_xls. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *"  IMPORTING *"     VALUE(IT_DATA) TYPE  STANDARD TABLE *"----------------------------------------------------------------------   "Создаем instance ALV   DATA(lo_alv_spreadsheet) = NEW lcl_alv( ).   "Формируем каталог полей   DATA(lt_fcat) = lo_alv_spreadsheet->create_fcat( it_data = it_data ).   CHECK lt_fcat[] IS NOT INITIAL.   "Передаем таблицу в ALV   lo_alv_spreadsheet->set_table_for_first_display(     CHANGING       it_outtab                     = it_data[]       it_fieldcatalog               = lt_fcat[]     EXCEPTIONS       invalid_parameter_combination = 1       program_error                 = 2       too_many_lines                = 3       OTHERS                        = 4   ).   CHECK sy-subrc = 0.   "Вызываем стандартный диалог для сохранения в Excel   lo_alv_spreadsheet->export_to_excel( it_data = it_data[] ). ENDFUNCTION. | 
Второй вариант
Использовать интерфейс у класса обертки – if_alv_rm_grid_friend
В данном случае мы получаем доступ ко всем private методам внутри lcl_alv_wrapper
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | CLASS lcl_alv_wrapper DEFINITION.   PUBLIC SECTION.     INTERFACES if_alv_rm_grid_friend .     METHODS:       constructor,       get_alv_instance         RETURNING VALUE(ro_alv) TYPE REF TO cl_gui_alv_grid,       export_to_excel         IMPORTING           VALUE(it_data) TYPE ANY TABLE,       create_fcat         IMPORTING                   it_data           TYPE ANY TABLE                   it_exclude_fields TYPE tc_field_tab OPTIONAL         RETURNING VALUE(rt_fcat)    TYPE lvc_t_fcat,       free.   PRIVATE SECTION.     DATA mo_dummy_container TYPE REF TO cl_gui_custom_container.     DATA mo_alv TYPE REF TO cl_gui_alv_grid. ENDCLASS. CLASS lcl_alv_wrapper IMPLEMENTATION. *--------------------------------------------------------------------* * CONSTRUCTOR *--------------------------------------------------------------------* * Конструктор *--------------------------------------------------------------------*   METHOD constructor.     "Создаем фиктивный контейнер (т.к. ALV не будет нигде отображаться)     CREATE OBJECT mo_dummy_container       EXPORTING         container_name              = space       EXCEPTIONS         cntl_error                  = 1         cntl_system_error           = 2         create_error                = 3         lifetime_error              = 4         lifetime_dynpro_dynpro_link = 5         OTHERS                      = 6.     ASSERT sy-subrc = 0.     mo_alv = NEW #( i_parent = mo_dummy_container ).     ASSERT mo_alv IS BOUND.   ENDMETHOD. *--------------------------------------------------------------------* * GET_ALV_INSTANCE *--------------------------------------------------------------------* * Вернуть instance ALV *--------------------------------------------------------------------*   METHOD get_alv_instance.     "Возвращаем     ro_alv = mo_alv.   ENDMETHOD. *--------------------------------------------------------------------* * EXPORT_TO_EXCEL *--------------------------------------------------------------------* * Выгрузка в Excel *--------------------------------------------------------------------*   METHOD export_to_excel.     "Выполнение команды     mo_alv->execute_fcode(       EXPORTING         i_ucomm = cl_gui_alv_grid=>mc_fc_call_xxl     ).   ENDMETHOD. *--------------------------------------------------------------------* * CREATE_FCAT *--------------------------------------------------------------------* * Формирование каталога полей *--------------------------------------------------------------------*   METHOD create_fcat.     "Создаем таблицу входящего типа     DATA lo_table TYPE REF TO data.     TRY.         CREATE DATA lo_table LIKE it_data.         ASSIGN lo_table->* TO FIELD-SYMBOL(<lt_table>).         cl_salv_table=>factory( IMPORTING                                   r_salv_table   = DATA(lo_salv_table)                                 CHANGING                                   t_table        = <lt_table>  ).         "Забираем каталог полей         rt_fcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(             r_columns      = lo_salv_table->get_columns( )             r_aggregations = lo_salv_table->get_aggregations( )         ).       CATCH cx_root.         RETURN.     ENDTRY.   ENDMETHOD. *--------------------------------------------------------------------* * FREE *--------------------------------------------------------------------* * Зачистка атрибутов *--------------------------------------------------------------------*   METHOD free.     "Зачистка атрибутов     FREE mo_alv.     FREE mo_dummy_container.   ENDMETHOD. ENDCLASS. | 
Пример использования:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | FUNCTION zexport_to_xls. *"---------------------------------------------------------------------- *"*"Локальный интерфейс: *"  IMPORTING *"     VALUE(IT_DATA) TYPE  STANDARD TABLE *"----------------------------------------------------------------------   DATA(lo_alv_wrapper) = NEW lcl_alv_wrapper( ).   "Формируем каталог полей   DATA(lt_fcat) = lo_alv_wrapper->create_fcat( it_data = it_data ).   CHECK lt_fcat[] IS NOT INITIAL.   "Передаем таблицу в ALV   lo_alv_wrapper->get_alv_instance( )->set_table_for_first_display(       CHANGING         it_outtab                     = it_data[]         it_fieldcatalog               = lt_fcat[]       EXCEPTIONS         invalid_parameter_combination = 1         program_error                 = 2         too_many_lines                = 3         OTHERS                        = 4     ).   "Вызываем стандартный диалог для сохранения в Excel   lo_alv_wrapper->export_to_excel( it_data = it_data[] ).   "Завершаем работу   lo_alv_wrapper->free( ).   FREE lo_alv_wrapper. ENDFUNCTION. | 
 
	