ABAP-RFC接口文档导出程序

发布时间 2023-12-04 09:25:00作者: 阿胖的阿多
*&---------------------------------------------------------------------*
*& Report ZTEST_RFC
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ztest_rfc LINE-SIZE 255..

*&---------------------------------------------------------------------*
*& Report  YLB011
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*


INCLUDE yfunc_excel.


TYPE-POOLS : rmdi.
**********************************************************************
*Define Types
**********************************************************************
TYPES: BEGIN OF ts_func,
         parameter  TYPE fupararef-parameter,  "参数名称
         paramtype  TYPE fupararef-paramtype,  "参数类型
         structure  TYPE fupararef-structure,  "接口参数的参考类型
         defaultval TYPE fupararef-defaultval, "输入参数的缺省值
         optional   TYPE fupararef-optional,   "可选参数
         pposition  TYPE fupararef-pposition, "表格行
         stext      TYPE funct-stext,          "短文本
       END OF ts_func,
       tt_func TYPE TABLE OF ts_func.

**********************************************************************
*Global Data
**********************************************************************
DATA: gt_func  TYPE tt_func,
      gt_imp   TYPE tt_func,
      gt_exp   TYPE tt_func,
      gt_cha   TYPE tt_func,
      gt_tab   TYPE tt_func,
      gt_struc TYPE tt_func.

DATA: gt_dd07v TYPE TABLE OF dd07v.

DATA: go_excel TYPE REF TO lcl_excel.
**********************************************************************
* SELECTION-SCREEN
**********************************************************************
PARAMETERS: p_fname LIKE fupararef-funcname.

SELECTION-SCREEN SKIP 1.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETER p_xls AS CHECKBOX.
  PARAMETER p_dir TYPE string.

  SELECTION-SCREEN SKIP 1.
  PARAMETER p_yh AS CHECKBOX.
SELECTION-SCREEN END OF BLOCK b1.


INITIALIZATION.
  p_xls = 'X'.
  CALL METHOD cl_gui_frontend_services=>get_desktop_directory
    CHANGING
      desktop_directory    = p_dir
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  CALL METHOD cl_gui_cfw=>update_view.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_dir.
  CALL METHOD cl_gui_frontend_services=>directory_browse
*    EXPORTING
*      window_title         =
*      initial_folder       =
    CHANGING
      selected_folder      = p_dir
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.



START-OF-SELECTION.
  PERFORM get_ddic_datatype.

  PERFORM get_func_para USING p_fname gt_func.
  PERFORM classify_func USING gt_func
                                gt_imp
                                gt_exp
                                gt_cha
                                gt_tab.

  PERFORM write_list.

  IF p_xls = 'X'.
    PERFORM download_template.
    LEAVE LIST-PROCESSING.
  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  write_list
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM write_list.
  PERFORM write_head.
  PERFORM write_para USING '输入'  gt_imp gt_struc.
  PERFORM write_para USING '输出'  gt_exp gt_struc.
  PERFORM write_para USING '修改'  gt_cha gt_struc.
  PERFORM write_para USING ''    gt_tab gt_struc.

  PERFORM write_sturc USING gt_struc.
ENDFORM.                    "write_list

*&---------------------------------------------------------------------*
*&      Form  download_template
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM download_template.
  DATA: ld_row TYPE i.


  DATA: ld_xls_file TYPE string.
  CONCATENATE p_dir '\' p_fname '_' sy-datum '.xls' INTO ld_xls_file.
  CREATE OBJECT go_excel
    EXPORTING
      id_xlsfile = ld_xls_file.

  PERFORM write_head_xls.

  ld_row = 2.
  PERFORM write_para_xls USING '输入' ld_row gt_imp.
  PERFORM write_para_xls USING '输出' ld_row gt_exp.
  PERFORM write_para_xls USING '修改' ld_row gt_cha.
  PERFORM write_para_xls USING ''  ld_row gt_tab.

  PERFORM write_sturc_xls USING ld_row gt_struc.
  DO 8 TIMES.
    go_excel->set_col_width( id_col_no = sy-index ).
  ENDDO.

  IF p_yh = 'X'.
    go_excel->select_range( id_range = 'A:H' ).
    go_excel->set_range_format( id_font_name = '微软雅黑' ).
  ENDIF.


  go_excel->frozen_window( id_row_no = 3 ).
  go_excel->save( ).
ENDFORM.                    "download_template


*&---------------------------------------------------------------------*
*&      Form  write_head_xls
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM write_head_xls.
  go_excel->rename_sheet( id_pos = 1 id_sheetname = p_fname ).
  go_excel->set_cell_data( id_col = 1 id_row = 1 id_value = '函数名' ).
  go_excel->set_cell_format( id_col = 1 id_row = 1 id_bold = 1  id_bg_color = 37 ).
  go_excel->set_cell_data( id_col = 2 id_row = 1 id_value = p_fname ).

  DATA: ld_stext TYPE tftit-stext.
  SELECT SINGLE stext INTO ld_stext FROM tftit WHERE funcname = p_fname.
  IF sy-subrc = 0.
    go_excel->set_cell_data( id_col = 5 id_row = 1 id_value = ld_stext ).
  ENDIF.

  DATA: ld_date TYPE char20,
        ld_time TYPE char20.

  WRITE sy-datum TO ld_date.
  WRITE sy-uzeit TO ld_time.
  CONCATENATE ld_date ld_time INTO ld_date SEPARATED BY space.

  go_excel->set_cell_data( id_col = 8 id_row = 1 id_value = ld_date ).

  go_excel->set_cell_data( id_col = 1 id_row = 2 id_value = '参数名' ).
  go_excel->set_cell_data( id_col = 2 id_row = 2 id_value = '类型' ).
  go_excel->set_cell_data( id_col = 3 id_row = 2 id_value = '长度' ).
  go_excel->set_cell_data( id_col = 4 id_row = 2 id_value = '小数' ).
  go_excel->set_cell_data( id_col = 5 id_row = 2 id_value = '描述文本' ).
  go_excel->set_cell_data( id_col = 6 id_row = 2 id_value = '可选' ).
  go_excel->set_cell_data( id_col = 7 id_row = 2 id_value = '默认值' ).
  go_excel->set_cell_data( id_col = 8 id_row = 2 id_value = '备注' ).

  go_excel->select_range( id_range = 'A2:H2' ).
  go_excel->set_range_format( id_bg_color = 37 ).
ENDFORM.                    "write_head_xls
*&---------------------------------------------------------------------*
*&      Form  write_para_xls
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_PTYPE   text
*      -->CD_ROW     text
*      -->IT_PARA    text
*----------------------------------------------------------------------*
FORM write_para_xls USING id_ptype
                          cd_row
                          it_para TYPE tt_func.
  CHECK it_para IS NOT INITIAL.
  cd_row = cd_row + 2.

  go_excel->set_cell_data(  id_col = 1 id_row = cd_row id_value = id_ptype ).
  go_excel->set_cell_format( id_col = 1 id_row = cd_row id_bold = 1  id_bg_color = 37 ).

  DATA: ls_para TYPE ts_func.
  LOOP AT it_para INTO ls_para.
    cd_row = cd_row + 1.
    go_excel->set_cell_data( id_col = 1 id_row = cd_row id_value = ls_para-parameter ).

    PERFORM write_ddic_info_xls USING cd_row ls_para-structure.

    go_excel->set_cell_data( id_col = 5 id_row = cd_row id_value = ls_para-stext ).
    go_excel->set_cell_data( id_col = 6 id_row = cd_row id_value = ls_para-optional ).
    go_excel->set_cell_data( id_col = 7 id_row = cd_row id_value = ls_para-defaultval ).

  ENDLOOP.
ENDFORM.                    "write_para_xls
*&---------------------------------------------------------------------*
*&      Form  get_ddic_datatype
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_ddic_datatype.
  CALL FUNCTION 'DDUT_DOMVALUES_GET'
    EXPORTING
      name          = 'DATATYPE'
*     LANGU         = SY-LANGU
*     TEXTS_ONLY    = ' '
    TABLES
      dd07v_tab     = gt_dd07v
    EXCEPTIONS
      illegal_input = 1
      OTHERS        = 2.
  IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ENDIF.

  SORT gt_dd07v BY domvalue_l.
ENDFORM.                    "get_ddic_datatype
*&---------------------------------------------------------------------*
*&      Form  get_func_para
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_FUNCNAME  text
*      -->ET_FUNC      text
*----------------------------------------------------------------------*
FORM get_func_para USING id_funcname
                         et_func TYPE tt_func.
  SELECT
      fupararef~parameter         "参数名称
      fupararef~paramtype         "参数类型
      fupararef~structure         "接口参数的参考类型
      fupararef~defaultval        "输入参数的缺省值
      fupararef~optional          "可选参数
      fupararef~pposition
      funct~stext                 "短文本
  FROM fupararef INNER JOIN funct
  ON funct~funcname  = fupararef~funcname AND
         funct~parameter = fupararef~parameter AND
         funct~spras     = sy-langu
  INTO TABLE et_func
  WHERE fupararef~funcname = id_funcname AND
          r3state = 'A'.
  IF sy-subrc <> 0.
    MESSAGE '无法识别的函数名' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

ENDFORM.                    "get_func_para

*&---------------------------------------------------------------------*
*&      Form  classify_func
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IT_FUNC    text
*      -->ET_IMP     text
*      -->ET_EXP     text
*      -->ET_CHA     text
*      -->ET_TAB     text
*----------------------------------------------------------------------*
FORM classify_func USING it_func TYPE tt_func
                         et_imp TYPE tt_func
                         et_exp TYPE tt_func
                         et_cha TYPE tt_func
                         et_tab TYPE tt_func.
  DATA: ls_func TYPE ts_func.

  LOOP AT it_func INTO ls_func.
    CASE ls_func-paramtype .
      WHEN 'I'.
        APPEND ls_func TO et_imp.
      WHEN 'E'.
        APPEND ls_func TO et_exp.
      WHEN 'C'.
        APPEND ls_func TO et_cha.
      WHEN 'T'.
        APPEND ls_func TO et_tab.
    ENDCASE.
  ENDLOOP.

  SORT et_imp BY pposition.
  SORT et_exp BY pposition.
  SORT et_cha BY pposition.
  SORT et_tab BY pposition.
ENDFORM.                    "classify_func
*&---------------------------------------------------------------------*
*&      Form  write_head
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_PTYPE   text
*      -->IT_PARA    text
*      -->CT_STRUC   text
*----------------------------------------------------------------------*
FORM write_head .
  WRITE: /(30) '函数名',
  (40) p_fname ,
  (10)  ''  ,
  (10)  '',
  (40) '',
  (5)  '',
  (20) '',
  (20) ''.

  SKIP 1.
  WRITE: /(30) '参数名',
  (20) '类型'  ,
  (10)  '长度'  ,
  (10)  '小数'  ,
  (40) '描述文本',
  (5)  '可选',
  (20) '默认值',
  (20) '备注'.
  WRITE sy-uline.
ENDFORM.                    "write_head
*&---------------------------------------------------------------------*
*&      Form  write_para
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_PTYPE   text
*      -->IT_PARA    text
*      -->CT_STRUC   text
*----------------------------------------------------------------------*
FORM write_para USING id_ptype
                      it_para TYPE tt_func
                      ct_struc TYPE tt_func.
  CHECK it_para IS NOT INITIAL.
  FORMAT INTENSIFIED COLOR = 5.
  WRITE :/(30) id_ptype.
  FORMAT INTENSIFIED COLOR = 0.

  DATA: ls_para       TYPE ts_func,
        ld_x_struc(1).
  LOOP AT it_para INTO ls_para.
    WRITE: /(30) ls_para-parameter     .

    CLEAR ld_x_struc.
    PERFORM write_ddic_info USING ls_para-structure
                                      ld_x_struc.
    IF ld_x_struc = 'X'.
      APPEND ls_para TO ct_struc.
    ENDIF.

    WRITE : (40) ls_para-stext         ,
    (5)  ls_para-optional      ,
    (20) ls_para-defaultval  .
  ENDLOOP.
  SKIP 2 .
ENDFORM.                    "write_para

*&---------------------------------------------------------------------*
*&      Form  write_ddic_info
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_DATA    text
*      -->ED_X_STRUC text
*----------------------------------------------------------------------*
FORM write_ddic_info USING id_data
                           ed_x_struc.
  DATA: ld_match(1).
  CHECK id_data IS NOT INITIAL.
  IF id_data CS '-'.
    "参考字段
    PERFORM get_ddic_ref_field USING id_data.
  ELSE.
    "按照数据元素处理
    PERFORM get_ddic_data_element USING id_data ld_match.

    "不是field  默认按照structure 处理
    CHECK ld_match = ''.
    ed_x_struc = 'X'.
    WRITE: (20) id_data,
    (10) '',
    (10) ''.
  ENDIF.
ENDFORM.                    "write_ddic_info

*&---------------------------------------------------------------------*
*&      Form  write_ddic_info_xls
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_ROW     text
*      -->ID_DATA    text
*----------------------------------------------------------------------*
FORM write_ddic_info_xls USING id_row TYPE i
                               id_data.
  DATA: ld_match(1).
  CHECK id_data IS NOT INITIAL.
  IF id_data CS '-'.
    "参考字段
    PERFORM get_ddic_ref_field_xls USING id_row
                                             id_data.
  ELSE.
    "按照数据元素处理
    PERFORM get_ddic_data_element_xls USING id_row id_data ld_match.

    "不是field  默认按照structure 处理
    CHECK ld_match = ''.

    go_excel->set_cell_data( id_col = 2 id_row = id_row id_value = id_data ).





  ENDIF.
ENDFORM.                    "write_ddic_info_xls


*&---------------------------------------------------------------------*
*&      Form  get_ddic_ref_field
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_DATA    text
*----------------------------------------------------------------------*
FORM get_ddic_ref_field USING id_data.
  DATA: ld_tabname   TYPE rmdi_name,
        ld_fieldname TYPE rmdi_fienm,
        ls_field     TYPE rmdi_tabfld.
  SPLIT id_data AT '-' INTO ld_tabname ld_fieldname.
  CALL FUNCTION 'RM_TABLE_INFO_GET'
    EXPORTING
      i_tabname    = ld_tabname
      i_fieldname  = ld_fieldname
      i_langu      = sy-langu
      i_read_texts = 'X'
    IMPORTING
*     E_TABHEADER  =
      e_tabfield_w = ls_field
*     E_TABFIELDS_T       =
    EXCEPTIONS
      not_found    = 1
      ddic_error   = 2
      OTHERS       = 3.
  IF sy-subrc = 0.
    WRITE:
    (20) ls_field-datatype,
    (10)  ls_field-leng.
    IF ls_field-decimals IS INITIAL.
      WRITE (10)  ''.
    ELSE.
      WRITE (10)  ls_field-decimals.
    ENDIF.
  ENDIF.


ENDFORM.                    "get_ddic_ref_field


*&---------------------------------------------------------------------*
*&      Form  get_ddic_ref_field_xls
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_ROW     text
*      -->ID_DATA    text
*----------------------------------------------------------------------*
FORM get_ddic_ref_field_xls USING id_row id_data.
  DATA: ld_tabname   TYPE rmdi_name,
        ld_fieldname TYPE rmdi_fienm,
        ls_field     TYPE rmdi_tabfld.
  SPLIT id_data AT '-' INTO ld_tabname ld_fieldname.
  CALL FUNCTION 'RM_TABLE_INFO_GET'
    EXPORTING
      i_tabname    = ld_tabname
      i_fieldname  = ld_fieldname
      i_langu      = sy-langu
      i_read_texts = 'X'
    IMPORTING
*     E_TABHEADER  =
      e_tabfield_w = ls_field
*     E_TABFIELDS_T       =
    EXCEPTIONS
      not_found    = 1
      ddic_error   = 2
      OTHERS       = 3.
  IF sy-subrc = 0.
    go_excel->set_cell_data( id_col = 2 id_row = id_row id_value = ls_field-datatype ).
    go_excel->set_cell_data( id_col = 3 id_row = id_row id_value = ls_field-leng ).

    IF ls_field-decimals IS NOT INITIAL.
      go_excel->set_cell_data( id_col = 4 id_row = id_row id_value = ls_field-decimals ).
    ENDIF.
  ENDIF.

ENDFORM.                    "get_ddic_ref_field_xls


*&---------------------------------------------------------------------*
*&      Form  get_ddic_data_element
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_DATA    text
*      -->ED_MATCH   text
*----------------------------------------------------------------------*
FORM get_ddic_data_element USING id_data
                                 ed_match.

  DATA: ls_dd04v TYPE dd04v.
  DATA: ld_name TYPE ddobjname.
  ld_name = id_data.
  CALL FUNCTION 'DDIF_DTEL_GET'
    EXPORTING
      name          = ld_name
*     STATE         = 'A'
*     LANGU         = ' '
    IMPORTING
*     GOTSTATE      =
      dd04v_wa      = ls_dd04v
*     TPARA_WA      =
    EXCEPTIONS
      illegal_input = 1
      OTHERS        = 2.
  IF ls_dd04v-datatype IS NOT INITIAL.
    WRITE:
    (20) ls_dd04v-datatype,
    (10)  ls_dd04v-leng.
    IF ls_dd04v-decimals IS INITIAL.
      WRITE (10)  ''.
    ELSE.
      WRITE (10)  ls_dd04v-decimals.
    ENDIF.
    ed_match = 'X'.
  ELSE.
    READ TABLE gt_dd07v TRANSPORTING NO FIELDS WITH KEY domvalue_l = id_data
    BINARY SEARCH.
    IF sy-subrc = 0.
      ed_match = 'X'.
    ENDIF.
  ENDIF.

ENDFORM.                    "get_ddic_data_element


*&---------------------------------------------------------------------*
*&      Form  get_ddic_data_element_xls
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->ID_ROW     text
*      -->ID_DATA    text
*      -->ED_MATCH   text
*----------------------------------------------------------------------*
FORM get_ddic_data_element_xls USING id_row TYPE i
                                     id_data
                                     ed_match.
  DATA: ls_dd04v TYPE dd04v.
  DATA: ld_name TYPE ddobjname.
  ld_name = id_data.
  CALL FUNCTION 'DDIF_DTEL_GET'
    EXPORTING
      name          = ld_name
*     STATE         = 'A'
*     LANGU         = ' '
    IMPORTING
*     GOTSTATE      =
      dd04v_wa      = ls_dd04v
*     TPARA_WA      =
    EXCEPTIONS
      illegal_input = 1
      OTHERS        = 2.
  IF ls_dd04v-datatype IS NOT INITIAL.
    go_excel->set_cell_data( id_col = 2 id_row = id_row id_value = ls_dd04v-datatype ).
    go_excel->set_cell_data( id_col = 3 id_row = id_row id_value = ls_dd04v-leng ).
    IF ls_dd04v-decimals IS NOT INITIAL.
      go_excel->set_cell_data( id_col = 4 id_row = id_row id_value = ls_dd04v-decimals ).
    ENDIF.
    ed_match = 'X'.
  ELSE.
    READ TABLE gt_dd07v TRANSPORTING NO FIELDS WITH KEY domvalue_l = id_data
    BINARY SEARCH.
    IF sy-subrc = 0.
      ed_match = 'X'.
    ENDIF.
  ENDIF.

ENDFORM.                    "get_ddic_data_element_xls
*&---------------------------------------------------------------------*
*&      Form  write_sturc
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->IT_STRUC   text
*----------------------------------------------------------------------*
FORM write_sturc USING it_struc TYPE tt_func.
  DATA: ls_struc   TYPE ts_func,
        ld_tabname TYPE rmdi_name,
        lt_field   TYPE rmdi_tabfld_t,
        ls_field   TYPE rmdi_tabfld.
  CHECK it_struc IS NOT INITIAL.

  SORT it_struc BY structure.
  DELETE ADJACENT DUPLICATES FROM it_struc COMPARING structure.

  WRITE /(30) '数据结构定义'.
  SKIP 1.
  LOOP AT it_struc INTO ls_struc.
*   校验是否是表类型
    DATA: ls_dd40l TYPE dd40l.
    SELECT SINGLE * FROM dd40l INTO ls_dd40l
    WHERE   typename = ls_struc-structure.
    IF sy-subrc = 0.
      ld_tabname = ls_dd40l-rowtype.
    ELSE.
      ld_tabname = ls_struc-structure.
    ENDIF.

    FORMAT INTENSIFIED COLOR = 4.
    WRITE :/(30) ls_struc-structure.
    "获取描述
    DATA: ld_ddtext TYPE dd02t-ddtext.
    SELECT SINGLE ddtext FROM  dd02t INTO ld_ddtext
    WHERE tabname = ld_tabname.
    IF sy-subrc = 0.
      WRITE (40) ld_ddtext.
    ENDIF.
    FORMAT INTENSIFIED COLOR = 0.
*    WRITE sy-uline.

    CALL FUNCTION 'RM_TABLE_INFO_GET'
      EXPORTING
        i_tabname     = ld_tabname
*       I_FIELDNAME   =
*       I_LANGU       =
        i_read_texts  = 'X'
      IMPORTING
*       E_TABHEADER   =
*       E_TABFIELD_W  =
        e_tabfields_t = lt_field
      EXCEPTIONS
        not_found     = 1
        ddic_error    = 2
        OTHERS        = 3.
    IF sy-subrc = 0.
      LOOP AT lt_field INTO ls_field.
        WRITE: /(30) ls_field-fieldname ,
        (20) ls_field-datatype,
        (10) ls_field-leng.
        IF ls_field-decimals IS INITIAL.
          WRITE (10)  ''.
        ELSE.
          WRITE (10)  ls_field-decimals.
        ENDIF.
        WRITE : (40) ls_field-fieldtext.
      ENDLOOP.
    ENDIF.
    SKIP 2.
  ENDLOOP.

ENDFORM.                    "write_sturc


*&---------------------------------------------------------------------*
*&      Form  write_sturc_xls
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->CD_ROW     text
*      -->IT_STRUC   text
*----------------------------------------------------------------------*
FORM write_sturc_xls USING cd_row TYPE i
                           it_struc TYPE tt_func.
  DATA: ls_struc   TYPE ts_func,
        ld_tabname TYPE rmdi_name,
        lt_field   TYPE rmdi_tabfld_t,
        ls_field   TYPE rmdi_tabfld.
  CHECK it_struc IS NOT INITIAL.

  SORT it_struc BY structure.
  DELETE ADJACENT DUPLICATES FROM it_struc COMPARING structure.

  cd_row = cd_row + 2.
  go_excel->set_cell_data( id_col = 1 id_row = cd_row id_value = '数据结构定义' ).
  go_excel->set_cell_format( id_col = 1 id_row = cd_row id_bold = 1  id_bg_color = 36 ).


  LOOP AT it_struc INTO ls_struc.
    cd_row = cd_row + 2.
*   校验是否是表类型
    DATA: ls_dd40l TYPE dd40l.
    SELECT SINGLE * FROM dd40l INTO ls_dd40l
    WHERE   typename = ls_struc-structure.
    IF sy-subrc = 0.
      ld_tabname = ls_dd40l-rowtype.
    ELSE.
      ld_tabname = ls_struc-structure.
    ENDIF.

    go_excel->set_cell_data( id_col = 1 id_row = cd_row id_value = ls_struc-structure ).
    go_excel->set_cell_format( id_col = 1 id_row = cd_row id_bold = 1 id_bg_color = 36 ).

    "获取描述
    DATA: ld_ddtext TYPE dd02t-ddtext.
    SELECT SINGLE ddtext FROM  dd02t INTO ld_ddtext
    WHERE tabname = ld_tabname.
    IF sy-subrc = 0.
      go_excel->set_cell_data( id_col = 5 id_row = cd_row id_value = ld_ddtext ).
    ENDIF.

    CALL FUNCTION 'RM_TABLE_INFO_GET'
      EXPORTING
        i_tabname     = ld_tabname
*       I_FIELDNAME   =
*       I_LANGU       =
        i_read_texts  = 'X'
      IMPORTING
*       E_TABHEADER   =
*       E_TABFIELD_W  =
        e_tabfields_t = lt_field
      EXCEPTIONS
        not_found     = 1
        ddic_error    = 2
        OTHERS        = 3.
    IF sy-subrc = 0.
      LOOP AT lt_field INTO ls_field.
        cd_row = cd_row + 1.

        go_excel->set_cell_data( id_col = 1 id_row = cd_row id_value = ls_field-fieldname ).
        go_excel->set_cell_data( id_col = 2 id_row = cd_row id_value = ls_field-datatype ).
        go_excel->set_cell_data( id_col = 3 id_row = cd_row id_value = ls_field-leng ).

        IF ls_field-decimals IS NOT INITIAL.
          go_excel->set_cell_data( id_col = 4 id_row = cd_row id_value = ls_field-decimals ).
        ENDIF.

        go_excel->set_cell_data( id_col = 5 id_row = cd_row id_value = ls_field-fieldtext ).
      ENDLOOP.
    ENDIF.
  ENDLOOP.

ENDFORM.                    "write_sturc_xls