将 itab 技术字段名称下载到 Excel
Download itab technical field names into Excel
我需要一个进程来下载 table 的字段(技术名称、字段名称)和前 5 行。
在下面的代码中,我可以下载除技术字段名称以外的所有内容,如何扩展它?
我得到字段名称及其值,但我还需要 excel 的第二行,即字段的技术名称(MATNR、MATKL 等)。
提前谢谢你。
DATA: v_default_file_name TYPE string,
v_filename TYPE string,
v_file_path TYPE string,
wa_table TYPE dd02l,
check_path TYPE string,
v_select TYPE string,
t_fieldcat TYPE lvc_t_fcat,
v_xml_version TYPE string,
v_xml_flavour TYPE string,
v_xstring TYPE xstring,
v_size TYPE i,
gt_bintab TYPE solix_tab.
DATA: r_data TYPE REF TO data,
r_structdescr TYPE REF TO cl_abap_structdescr,
r_table TYPE REF TO cl_salv_table,
r_columns TYPE REF TO cl_salv_columns_table,
r_aggreg TYPE REF TO cl_salv_aggregations,
r_result_data TYPE REF TO cl_salv_ex_result_data_table.
FIELD-SYMBOLS: <table> TYPE ANY TABLE,
<fs_component> TYPE abap_compdescr.
PARAMETERS: p_table TYPE dd02l-tabname .
PARAMETERS: p_path TYPE string OBLIGATORY.
INITIALIZATION.
LOOP AT SCREEN.
IF screen-name = P_PATH.
screen-input = 0.
MODIFY SCREEN.
EXIT.
ENDIF.
ENDLOOP.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
CONCATENATE p_table 'EXCEL_' SY-DATUM INTO v_default_file_name.
cl_gui_frontend_services=>file_save_dialog(
EXPORTING
window_title = ''
default_extension = 'XLS'
default_file_name = v_default_file_name
initial_directory = 'Desktop'
prompt_on_overwrite = 'X'
CHANGING
filename = v_filename
path = v_file_path
fullpath = p_path ).
IF sy-subrc <> 0.
MESSAGE 'ERROR' TYPE 'E'.
EXIT.
ENDIF.
START-OF-SELECTION.
TRANSLATE v_file_path TO UPPER CASE.
CONCATENATE v_file_path v_default_file_name '.XLS' INTO check_path.
SELECT SINGLE tabname INTO wa_table FROM dd02l
WHERE tabname EQ p_table
AND tabclass EQ 'TRANSP'.
IF sy-subrc NE 0.
MESSAGE 'ERROR' TYPE 'E'.
EXIT.
ENDIF.
IF p_path EQ check_path.
* Select all data
PERFORM get_table_data.
* Build excel output data
PERFORM build_excel_data.
* Export excel file
PERFORM export_excel.
ELSE.
MESSAGE 'ERROR' TYPE 'E'.
EXIT.
ENDIF.
FORM get_table_data.
CREATE DATA r_data TYPE STANDARD TABLE OF (p_table).
ASSIGN r_data->* TO <table>.
* Get all columns for select
r_structdescr ?= cl_abap_structdescr=>describe_by_name( p_table ).
IF r_structdescr IS BOUND.
LOOP AT r_structdescr->components[] ASSIGNING <fs_component>.
CONCATENATE v_select <fs_component>-name INTO v_select SEPARATED BY space.
ENDLOOP.
ENDIF.
* Select all data
SELECT (v_select) FROM (p_table) INTO TABLE <table>
UP TO 2 ROWS.
ENDFORM. "get_table_data
FORM build_excel_data.
TRY.
cl_salv_table=>factory(
EXPORTING
list_display = abap_false
IMPORTING
r_salv_table = r_table
CHANGING
t_table = <table> ).
CATCH cx_salv_msg.
ENDTRY.
* Get columns and aggregation to create fieldcatalog
r_columns = r_table->get_columns( ).
r_aggreg = r_table->get_aggregations( ).
t_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
r_columns = r_columns
r_aggregations = r_aggreg ).
* Create result data table
IF cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_25 OR
cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_26.
r_result_data = cl_salv_ex_util=>factory_result_data_table(
r_data = r_data
t_fieldcatalog = t_fieldcat ).
* Get XML version
CASE cl_salv_bs_a_xml_base=>get_version( ).
WHEN if_salv_bs_xml=>version_25.
v_xml_version = if_salv_bs_xml=>version_25.
WHEN if_salv_bs_xml=>version_26.
v_xml_version = if_salv_bs_xml=>version_26.
ENDCASE.
* Get XML flavour
v_xml_flavour = if_salv_bs_c_tt=>c_tt_xml_flavour_export.
* Create excel data
CALL METHOD cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform(
EXPORTING
xml_type = if_salv_bs_xml=>c_type_mhtml
xml_version = v_xml_version
r_result_data = r_result_data
xml_flavour = v_xml_flavour
gui_type = if_salv_bs_xml=>c_gui_type_gui
IMPORTING
xml = v_xstring ).
ENDIF.
ENDFORM. "build_excel_data
FORM export_excel.
IF v_xstring IS NOT INITIAL.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = v_xstring
IMPORTING
output_length = v_size
TABLES
binary_tab = gt_bintab.
CALL METHOD cl_gui_frontend_services=>gui_download(
EXPORTING
bin_filesize = v_size
filename = p_path
filetype = 'BIN'
CHANGING
data_tab = gt_bintab ).
ENDIF.
ENDFORM. "export_excel
我认为这里的问题是通过 ALV 生成 excel。
添加技术字段的第一行是不可行的,因为 <table>
字段符号具有 mara(例如)结构,并且您不能以 char1 类型传递字符串 'MTART'
我想你有两个选择:
选项 1
不要使用 ALV 并通过其他方式生成 excel,以便您可以在 table 中处理 字符串类型 。例如你可以尝试函数 ALSM_EXCEL_TO_INTERNAL_TABLE
选项 2
尝试将 R_TOP_OF_LIST
参数传递给方法 cl_salv_ex_util=>factory_result_data_table
。
结果会接近你问的,但也许可以acceptable: 技术领域将在名称前加上一个空行在
之间
DATA gt_components TYPE abap_compdescr_tab.
DATA lr_content TYPE REF TO cl_salv_form_element.
DATA lr_form TYPE REF TO cl_salv_form.
". . .
gt_components = r_structdescr->components[].
". . .
PERFORM built_header CHANGING lr_content. " builds the technical names list
create OBJECT lr_form.
lr_form->set_content( lr_content ).
". . .
r_result_data = cl_salv_ex_util=>factory_result_data_table(
r_data = r_data
t_fieldcatalog = t_fieldcat
r_top_of_list = lr_form
". . .
FORM built_header CHANGING cr_content TYPE REF TO cl_salv_form_element.
DATA: lr_grid TYPE REF TO cl_salv_form_layout_grid,
lr_label TYPE REF TO cl_salv_form_label.
CREATE OBJECT lr_grid.
LOOP AT gt_components into data(ls_comp).
data(col) = sy-tabix.
lr_label = lr_grid->create_label(
row = 1
column = col
text = ls_comp-name
tooltip = '' ).
ENDLOOP.
cr_content = lr_grid.
ENDFORM. " built_header
只需像这样重写您的 get_table_data
子例程:
FORM get_table_data.
r_structdescr ?= cl_abap_structdescr=>describe_by_name( p_name ).
DATA(components) = r_structdescr->get_components( ).
DATA(fields) = VALUE ddfields( FOR line IN r_structdescr->get_ddic_field_list( ) ( line ) ).
" making all fields string
MODIFY components FROM VALUE abap_componentdescr( type = CAST #( cl_abap_typedescr=>describe_by_name( 'STRING' ) ) ) TRANSPORTING type WHERE name <> ''.
r_structdescr = cl_abap_structdescr=>create( components ).
DATA(o_ref_table) = cl_abap_tabledescr=>create( p_line_type = r_structdescr p_table_kind = cl_abap_tabledescr=>tablekind_std ).
CHECK o_ref_table IS BOUND.
CREATE DATA r_data TYPE HANDLE o_ref_table.
ASSIGN r_data->* TO <fs_table>.
APPEND INITIAL LINE TO <fs_table>. " reserving line for headers
DATA(select_cols) = REDUCE string( INIT col TYPE char2048 FOR <fld> IN fields NEXT col = COND #(
WHEN col <> space THEN col && `, ` && `CAST( ` && <fld>-fieldname && ` AS CHAR( ` && <fld>-leng && ` ) ) AS ` && <fld>-fieldname
ELSE `CAST( ` && <fld>-fieldname && ` AS CHAR( ` && <fld>-leng && ` ) ) AS ` && <fld>-fieldname ) ).
SELECT (select_cols)
UP TO 10 ROWS
FROM (p_name)
INTO CORRESPONDING FIELDS OF TABLE @<table>.
" writing headers
ASSIGN <table>[ 1 ] TO FIELD-SYMBOL(<empty>).
LOOP AT fields ASSIGNING FIELD-SYMBOL(<field>).
ASSIGN COMPONENT <field>-fieldname OF STRUCTURE <empty> TO FIELD-SYMBOL(<heading>).
CHECK sy-subrc = 0.
<heading> = <field>-fieldname.
ENDLOOP.
ENDFORM.
我需要一个进程来下载 table 的字段(技术名称、字段名称)和前 5 行。
在下面的代码中,我可以下载除技术字段名称以外的所有内容,如何扩展它?
我得到字段名称及其值,但我还需要 excel 的第二行,即字段的技术名称(MATNR、MATKL 等)。
提前谢谢你。
DATA: v_default_file_name TYPE string,
v_filename TYPE string,
v_file_path TYPE string,
wa_table TYPE dd02l,
check_path TYPE string,
v_select TYPE string,
t_fieldcat TYPE lvc_t_fcat,
v_xml_version TYPE string,
v_xml_flavour TYPE string,
v_xstring TYPE xstring,
v_size TYPE i,
gt_bintab TYPE solix_tab.
DATA: r_data TYPE REF TO data,
r_structdescr TYPE REF TO cl_abap_structdescr,
r_table TYPE REF TO cl_salv_table,
r_columns TYPE REF TO cl_salv_columns_table,
r_aggreg TYPE REF TO cl_salv_aggregations,
r_result_data TYPE REF TO cl_salv_ex_result_data_table.
FIELD-SYMBOLS: <table> TYPE ANY TABLE,
<fs_component> TYPE abap_compdescr.
PARAMETERS: p_table TYPE dd02l-tabname .
PARAMETERS: p_path TYPE string OBLIGATORY.
INITIALIZATION.
LOOP AT SCREEN.
IF screen-name = P_PATH.
screen-input = 0.
MODIFY SCREEN.
EXIT.
ENDIF.
ENDLOOP.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
CONCATENATE p_table 'EXCEL_' SY-DATUM INTO v_default_file_name.
cl_gui_frontend_services=>file_save_dialog(
EXPORTING
window_title = ''
default_extension = 'XLS'
default_file_name = v_default_file_name
initial_directory = 'Desktop'
prompt_on_overwrite = 'X'
CHANGING
filename = v_filename
path = v_file_path
fullpath = p_path ).
IF sy-subrc <> 0.
MESSAGE 'ERROR' TYPE 'E'.
EXIT.
ENDIF.
START-OF-SELECTION.
TRANSLATE v_file_path TO UPPER CASE.
CONCATENATE v_file_path v_default_file_name '.XLS' INTO check_path.
SELECT SINGLE tabname INTO wa_table FROM dd02l
WHERE tabname EQ p_table
AND tabclass EQ 'TRANSP'.
IF sy-subrc NE 0.
MESSAGE 'ERROR' TYPE 'E'.
EXIT.
ENDIF.
IF p_path EQ check_path.
* Select all data
PERFORM get_table_data.
* Build excel output data
PERFORM build_excel_data.
* Export excel file
PERFORM export_excel.
ELSE.
MESSAGE 'ERROR' TYPE 'E'.
EXIT.
ENDIF.
FORM get_table_data.
CREATE DATA r_data TYPE STANDARD TABLE OF (p_table).
ASSIGN r_data->* TO <table>.
* Get all columns for select
r_structdescr ?= cl_abap_structdescr=>describe_by_name( p_table ).
IF r_structdescr IS BOUND.
LOOP AT r_structdescr->components[] ASSIGNING <fs_component>.
CONCATENATE v_select <fs_component>-name INTO v_select SEPARATED BY space.
ENDLOOP.
ENDIF.
* Select all data
SELECT (v_select) FROM (p_table) INTO TABLE <table>
UP TO 2 ROWS.
ENDFORM. "get_table_data
FORM build_excel_data.
TRY.
cl_salv_table=>factory(
EXPORTING
list_display = abap_false
IMPORTING
r_salv_table = r_table
CHANGING
t_table = <table> ).
CATCH cx_salv_msg.
ENDTRY.
* Get columns and aggregation to create fieldcatalog
r_columns = r_table->get_columns( ).
r_aggreg = r_table->get_aggregations( ).
t_fieldcat = cl_salv_controller_metadata=>get_lvc_fieldcatalog(
r_columns = r_columns
r_aggregations = r_aggreg ).
* Create result data table
IF cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_25 OR
cl_salv_bs_a_xml_base=>get_version( ) EQ if_salv_bs_xml=>version_26.
r_result_data = cl_salv_ex_util=>factory_result_data_table(
r_data = r_data
t_fieldcatalog = t_fieldcat ).
* Get XML version
CASE cl_salv_bs_a_xml_base=>get_version( ).
WHEN if_salv_bs_xml=>version_25.
v_xml_version = if_salv_bs_xml=>version_25.
WHEN if_salv_bs_xml=>version_26.
v_xml_version = if_salv_bs_xml=>version_26.
ENDCASE.
* Get XML flavour
v_xml_flavour = if_salv_bs_c_tt=>c_tt_xml_flavour_export.
* Create excel data
CALL METHOD cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform(
EXPORTING
xml_type = if_salv_bs_xml=>c_type_mhtml
xml_version = v_xml_version
r_result_data = r_result_data
xml_flavour = v_xml_flavour
gui_type = if_salv_bs_xml=>c_gui_type_gui
IMPORTING
xml = v_xstring ).
ENDIF.
ENDFORM. "build_excel_data
FORM export_excel.
IF v_xstring IS NOT INITIAL.
CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'
EXPORTING
buffer = v_xstring
IMPORTING
output_length = v_size
TABLES
binary_tab = gt_bintab.
CALL METHOD cl_gui_frontend_services=>gui_download(
EXPORTING
bin_filesize = v_size
filename = p_path
filetype = 'BIN'
CHANGING
data_tab = gt_bintab ).
ENDIF.
ENDFORM. "export_excel
我认为这里的问题是通过 ALV 生成 excel。
添加技术字段的第一行是不可行的,因为 <table>
字段符号具有 mara(例如)结构,并且您不能以 char1 类型传递字符串 'MTART'
我想你有两个选择:
选项 1
不要使用 ALV 并通过其他方式生成 excel,以便您可以在 table 中处理 字符串类型 。例如你可以尝试函数 ALSM_EXCEL_TO_INTERNAL_TABLE
选项 2
尝试将 R_TOP_OF_LIST
参数传递给方法 cl_salv_ex_util=>factory_result_data_table
。
结果会接近你问的,但也许可以acceptable: 技术领域将在名称前加上一个空行在
之间DATA gt_components TYPE abap_compdescr_tab.
DATA lr_content TYPE REF TO cl_salv_form_element.
DATA lr_form TYPE REF TO cl_salv_form.
". . .
gt_components = r_structdescr->components[].
". . .
PERFORM built_header CHANGING lr_content. " builds the technical names list
create OBJECT lr_form.
lr_form->set_content( lr_content ).
". . .
r_result_data = cl_salv_ex_util=>factory_result_data_table(
r_data = r_data
t_fieldcatalog = t_fieldcat
r_top_of_list = lr_form
". . .
FORM built_header CHANGING cr_content TYPE REF TO cl_salv_form_element.
DATA: lr_grid TYPE REF TO cl_salv_form_layout_grid,
lr_label TYPE REF TO cl_salv_form_label.
CREATE OBJECT lr_grid.
LOOP AT gt_components into data(ls_comp).
data(col) = sy-tabix.
lr_label = lr_grid->create_label(
row = 1
column = col
text = ls_comp-name
tooltip = '' ).
ENDLOOP.
cr_content = lr_grid.
ENDFORM. " built_header
只需像这样重写您的 get_table_data
子例程:
FORM get_table_data.
r_structdescr ?= cl_abap_structdescr=>describe_by_name( p_name ).
DATA(components) = r_structdescr->get_components( ).
DATA(fields) = VALUE ddfields( FOR line IN r_structdescr->get_ddic_field_list( ) ( line ) ).
" making all fields string
MODIFY components FROM VALUE abap_componentdescr( type = CAST #( cl_abap_typedescr=>describe_by_name( 'STRING' ) ) ) TRANSPORTING type WHERE name <> ''.
r_structdescr = cl_abap_structdescr=>create( components ).
DATA(o_ref_table) = cl_abap_tabledescr=>create( p_line_type = r_structdescr p_table_kind = cl_abap_tabledescr=>tablekind_std ).
CHECK o_ref_table IS BOUND.
CREATE DATA r_data TYPE HANDLE o_ref_table.
ASSIGN r_data->* TO <fs_table>.
APPEND INITIAL LINE TO <fs_table>. " reserving line for headers
DATA(select_cols) = REDUCE string( INIT col TYPE char2048 FOR <fld> IN fields NEXT col = COND #(
WHEN col <> space THEN col && `, ` && `CAST( ` && <fld>-fieldname && ` AS CHAR( ` && <fld>-leng && ` ) ) AS ` && <fld>-fieldname
ELSE `CAST( ` && <fld>-fieldname && ` AS CHAR( ` && <fld>-leng && ` ) ) AS ` && <fld>-fieldname ) ).
SELECT (select_cols)
UP TO 10 ROWS
FROM (p_name)
INTO CORRESPONDING FIELDS OF TABLE @<table>.
" writing headers
ASSIGN <table>[ 1 ] TO FIELD-SYMBOL(<empty>).
LOOP AT fields ASSIGNING FIELD-SYMBOL(<field>).
ASSIGN COMPONENT <field>-fieldname OF STRUCTURE <empty> TO FIELD-SYMBOL(<heading>).
CHECK sy-subrc = 0.
<heading> = <field>-fieldname.
ENDLOOP.
ENDFORM.