Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将itab技术字段名称下载到Excel中_Excel_Dynamic_Abap - Fatal编程技术网

将itab技术字段名称下载到Excel中

将itab技术字段名称下载到Excel中,excel,dynamic,abap,Excel,Dynamic,Abap,我需要一个过程来下载表的字段(技术名称、字段名称)和前5行 在下面的代码中,我可以下载除技术字段名以外的所有内容,如何扩展它 我得到字段名及其值,但我还需要excel的第二行,即字段的技术名称(MATNR、MATKL等) 先谢谢你 DATA: v_default_file_name TYPE string, v_filename TYPE string, v_file_path TYPE string, wa_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
DATA:v\u默认\u文件\u名称类型字符串,
v_文件名类型字符串,
v_文件_路径类型字符串,
wa_表类型dd02l,
检查路径类型字符串,
v_选择类型字符串,
t_fieldcat型lvc_t_fcat,
v_xml_版本类型字符串,
v_xml_风格类型字符串,
v_xstring类型xstring,
v_尺寸类型i,
gt_bintab类型solix_tab。
数据:r_数据类型参考数据,
r_structdescr类型参考至cl_abap_structdescr,
r_表类型参考cl_salv_表,
r_列类型参考cl_salv_列表,
r_aggreg类型引用到cl_salv_聚合,
r_结果数据类型参考cl_salv_ex_结果数据表。
字段符号:键入任何表格,
输入abap_compdescr。
参数:p_表类型dd02l tabname。
参数:p_路径类型字符串必填。
初始化。
在屏幕上循环。
如果屏幕名称=P_路径。
屏幕输入=0。
修改屏幕。
出口
恩迪夫。
结束循环。
在p_路径的值请求的选择屏幕上。
将p_表“EXCEL”SY-DATU连接到v_默认文件名中。
cl_gui_前端_服务=>文件_保存_对话框(
出口
窗口标题=“”
默认扩展名='XLS'
default\u file\u name=v\u default\u file\u name
初始目录='桌面'
_覆盖时提示_='X'
改变
filename=v_文件名
路径=v_文件路径
完整路径=p_路径)。
如果sy subrc为0。
消息“ERROR”类型为“E”。
出口
恩迪夫。
开始选择。
将v_文件路径转换为大写。
将v_文件路径v_默认文件名'.XLS'连接到check_路径。
从dd02l中将单个选项卡名选择到wa_表中
其中tabname EQ p_表
和TABEQ类“TRANSP”。
如果sy subrc NE为0。
消息“ERROR”类型为“E”。
出口
恩迪夫。
如果p_路径相等,请检查p_路径。
*选择所有数据
执行获取表格数据。
*构建excel输出数据
执行生成excel数据。
*导出excel文件
执行excel导出。
其他的
消息“ERROR”类型为“E”。
出口
恩迪夫。
表单获取表格数据。
创建数据r_数据类型标准表(p_表)。
将r_数据->*分配给。
*获取select的所有列
r_structdescr?=cl_abap_structdescr=>按_名称(p_表)描述_。
如果r_structdescr是绑定的。
在r_structdescr->components[]赋值处循环。
将v_select-name连接到v_select中,并用空格分隔。
结束循环。
恩迪夫。
*选择所有数据
从(p_表)中选择(v_选择)到表中
最多2行。
尾型。“获取表数据”
表单生成excel数据。
尝试
cl_salv_表=>工厂(
出口
列表显示=abap\U错误
进口
r_salv_table=r_table
改变
t_表=)。
抓到你的萨尔夫味精。
结束。
*获取列和聚合以创建fieldcatalog
r\u columns=r\u table->get\u columns()。
r\u aggreg=r\u表->获取聚合()。
t_fieldcat=cl_salv_controller_metadata=>get_lvc_fieldcatalog(
r_列=r_列
r_aggregations=r_aggreg)。
*创建结果数据表
如果cl\u salv\u bs\u a\u xml\u base=>get\u version()EQ如果cl\u salv\u bs\u xml=>version\u 25或
cl_salv_bs_a_xml_base=>get_version()EQ如果_salv_bs_xml=>version_26。
r_结果数据=cl_salv_ex_util=>工厂结果数据表(
r_数据=r_数据
t_fieldcatalog=t_fieldcat)。
*获取XML版本
CASE cl_salv_bs_a_xml_base=>get_version()。
当if_salv_bs_xml=>version_25时。
v_xml_version=if_salv_bs_xml=>version_25。
当if_salv_bs_xml=>version_26时。
v_xml_version=if_salv_bs_xml=>version_26。
尾声。
*获取XML风格
v_xml_flavor=if_salv_bs_c_tt=>c_tt_xml_flavor_导出。
*创建excel数据
调用方法cl_salv_bs_tt_util=>if_salv_bs_tt_util~transform(
出口
xml\u type=if\u salv\u bs\u xml=>c\u type\u mhtml
xml\u version=v\u xml\u version
r\u结果\u数据=r\u结果\u数据
xml\u flavor=v\u xml\u flavor
gui\u type=if\u salv\u bs\u xml=>c\u gui\u type\u gui
进口
xml=v_xstring)。
恩迪夫。
ENDFORM.“构建excel数据”
表格导出excel。
如果v_xstring不是初始值。
调用函数“SCMS_XSTRING_TO_BINARY”
出口
缓冲区=v_xstring
进口
输出长度=v尺寸
桌子
二进制\u tab=gt\u bintab。
调用方法cl\u gui\u frontend\u services=>gui\u下载(
出口
bin\u filesize=v\u size
filename=p_路径
文件类型='BIN'
改变
数据(选项卡=gt(选项卡)。
恩迪夫。
尾型。“导出excel

我相信这里的问题是通过ALV生成excel

添加包含技术字段的第一行是不可行的,因为
字段符号具有mara(例如)结构,并且不能在char1类型中传递字符串“MTART”

我认为你有两个选择:

选项1

不要使用ALV并通过其他方式生成excel,以便您可以处理表中的字符串类型。例如,您可以尝试函数
ALSM\u excel\u TO\u INTERNAL\u table

选项2

尝试将
R\u-TOP\u-OF-u-LIST
参数传递给方法
cl\u-salv\u-ex_
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
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.