下载表格技术领域名称到Excel

问题描述 投票:0回答:1

我需要一个过程来下载一个表的字段(技术名称、字段名称)和一个表的5条记录。

在下面的代码中,我可以下载除了技术字段名以外的所有内容,如何扩展它?

我得到了字段名和它们的值,但我还需要excel的第二行,即字段的技术名称(MATNR,MATKL等)。

先谢谢你。


*&---------------------------------------------------------------------*
*& Report  Z_TEST_FIELDS
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT Z_TEST_FIELDS.

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

    EXCEPTIONS

      cntl_error          = 1
      error_no_gui        = 2
      not_supported_by_gui = 3
      OTHERS              = 4

 ).

  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

      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.

    IF sy-subrc <> 0.

*  MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

*             WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

    ENDIF.

  ENDIF.

ENDFORM.                    "export_excel


excel sap abap
1个回答
0
投票

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

添加第一行的技术字段是不可行的,因为...。<table> 字段符号具有马拉(例如)结构,你不能在char1类型中传递字符串'MTART'。

我想你有2个选择。

选择一:

不使用ALV,通过其他方式生成excel,这样就可以处理好 串类型 在你的表中。例如,您可以尝试使用函数 ALSM_EXCEL_TO_INTERNAL_TABLE

备选方案2

试试 R_TOP_OF_LIST 方法的参数 cl_salv_ex_util=>factory_result_data_table

结果将是 靠近 您的要求,但也许可以接受。技术字段要加在名字之前,并且在名字和技术字段之间空一行。

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
© www.soinside.com 2019 - 2024. All rights reserved.