Задача состоит в том, что бы имея только внутренние таблицы, сделать конвертацию их в EXCEL файл, затем эти файлы собрать в один zip архив.
- Создадим таблицы, я использую динамический подход. Он удобен тем, что на ходу можно создавать таблицы любой структуры например используя метод cl_alv_table_create=>create_dynamic_table.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
data: tabname1 type string value 'ztabname1', tabname2 type string value 'ztabname2', tabname3 type string value 'ztabname3', tabname4 type string value 'ztabname4', datatab1 type ref to data, datatab2 type ref to data, datatab3 type ref to data, datatab4 type ref to data. create data datatab1 type table of (tabname1). create data datatab2 type table of (tabname2). create data datatab3 type table of (tabname3). create data datatab4 type table of (tabname4). assign datatab1->* to field-symbol(<tab1>). assign datatab2->* to field-symbol(<tab2>). assign datatab3->* to field-symbol(<tab3>). assign datatab4->* to field-symbol(<tab4>). |
В <tab1>…<tab4> находятся внутренние таблицы с разными структурами. Заполним их как-нибудь из базы данных либо в ручную.
2.Следующим шагом необходимо каким-то образом преобразовать внутреннюю таблицу в 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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
class zcl_itab_to_xlsx definition. public section. class-methods: create_xlsx_from_itab importing it_fieldcat type lvc_t_fcat optional it_sort type lvc_t_sort optional it_filt type lvc_t_filt optional is_layout type lvc_s_layo optional it_hyperlinks type lvc_t_hype optional value(it_data) type standard table returning value(r_xstring) type xstring. endclass. class zcl_itab_to_xlsx implementation. method create_xlsx_from_itab. data(lt_data) = ref #( it_data ). if it_fieldcat is initial. field-symbols: <tab> type standard table. assign lt_data->* to <tab>. try. cl_salv_table=>factory( exporting list_display = abap_false importing r_salv_table = data(salv_table) changing t_table = <tab> ). data(lt_fcat) = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns = salv_table->get_columns( ) r_aggregations = salv_table->get_aggregations( ) ). loop at lt_fcat assigning field-symbol(<field_line>). <field_line>-reptext = <field_line>-fieldname. endloop. catch cx_salv_msg. return. endtry. else. lt_fcat = it_fieldcat. endif. cl_salv_bs_lex=>export_from_result_data_table( exporting is_format = if_salv_bs_lex_format=>mc_format_xlsx ir_result_data_table = cl_salv_ex_util=>factory_result_data_table( r_data = lt_data s_layout = is_layout t_fieldcatalog = lt_fcat t_sort = it_sort t_filter = it_filt t_hyperlinks = it_hyperlinks ) importing er_result_file = r_xstring ). endmethod. endclass. |
Вызовем метод с нашими таблицами, для получения XSTRING.
1 2 3 4 5 6 7 8 9 |
data: xfile1 type xstring, xfile2 type xstring, xfile3 type xstring, xfile4 type xstring. xfile1 = zcl_itab_to_xlsx=>create_xlsx_from_itab( <tab1> ). xfile2 = zcl_itab_to_xlsx=>create_xlsx_from_itab( <tab2> ). xfile3 = zcl_itab_to_xlsx=>create_xlsx_from_itab( <tab3> ). xfile4 = zcl_itab_to_xlsx=>create_xlsx_from_itab( <tab4> ). |
3. Далее создаем ZIP архив
1 2 3 4 5 6 7 8 9 |
data: zip_tool type ref to cl_abap_zip. zip_tool = new #( ). zip_tool->add( exporting name = 'file1.xlsx' content = xfile1 ). zip_tool->add( exporting name = 'file2.xlsx' content = xfile2 ). zip_tool->add( exporting name = 'file3.xlsx' content = xfile3 ). zip_tool->add( exporting name = 'file4.xlsx' content = xfile4 ). data: zip_file type xstring. zip_file = zip_tool->save( ). |
4. Последним шагом спрашиваем у пользователя директорию и сохраняем файл на компьютере.
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 |
data:zip_size type i, zip_binary type standard table of raw255. call function 'SCMS_XSTRING_TO_BINARY' exporting buffer = zip_file importing output_length = zip_size tables binary_tab = zip_binary. data: dir type string. cl_gui_frontend_services=>directory_browse( exporting window_title = 'Укажите директорию' changing selected_folder = dir exceptions cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 others = 4 ). dir = dir && '\archive.zip'. cl_gui_frontend_services=>gui_download( EXPORTING bin_filesize = zip_size filename = dir filetype = 'BIN' CHANGING data_tab = zip_binary 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 not_supported_by_gui = 22 error_no_gui = 23 OTHERS = 24 ). |
В итоге на компьютере сохранится архив с 4-мя excel файлами. Используя более структурированный подход к динамичному программированию в ABAP, нежели в этом примере, можно создавать архивы с файлами любого содержания и структур, при этом не затрачивая сотни строк.