二维码

[fmalv] 复制ALV页面数据到剪切板

Twilight发表于 2020-08-05 13:09Twilight 最后回复于 2020-08-05 13:09 [复制链接] 2523 0

  1. *&---------------------------------------------------------------------*
  2. *& Form FRM_ALV_DISPLAY
  3. *&---------------------------------------------------------------------*
  4. *& text
  5. *&---------------------------------------------------------------------*
  6. *& -->  p1        text
  7. *& <--  p2        text
  8. *&---------------------------------------------------------------------*
  9. FORM frm_alv_display .

  10.   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
  11.     EXPORTING
  12.       i_bypassing_buffer       = 'X'
  13.       i_callback_program       = sy-repid
  14.       it_fieldcat_lvc          = gt_fieldcat[]
  15.       i_callback_pf_status_set = 'FRM_STATUS'
  16.       i_callback_user_command  = 'USER_COMMAND'
  17.       is_layout_lvc            = gs_layout
  18. *     i_save                   = 'A'
  19.     TABLES
  20.       t_outtab                 = gt_output
  21.     EXCEPTIONS
  22.       program_error            = 1
  23.       OTHERS                   = 2.

  24. ENDFORM.
  25. *&---------------------------------------------------------------------*
  26. *&      Form  FRM_STATUS
  27. *&---------------------------------------------------------------------*
  28. *       text
  29. *----------------------------------------------------------------------*
  30. *      -->R_FLG_POPUP  text
  31. *----------------------------------------------------------------------*
  32. FORM frm_status USING r_flg_popup TYPE slis_t_extab. "GUI定义
  33.   SET PF-STATUS 'ZSTATUS'.
  34. ENDFORM.                    "FRM_STATUS
  35. *&---------------------------------------------------------------------*
  36. *&      FORM  USER_COMMAND
  37. *&---------------------------------------------------------------------*
  38. FORM user_command USING pi_ucomm TYPE sy-ucomm
  39.                         ps_selfield TYPE slis_selfield.

  40.   CASE pi_ucomm.
  41.     WHEN 'TO_CLIPBRD'.
  42.       PERFORM frm_alv_to_clipboard.
  43.   ENDCASE.

  44. ENDFORM.                    " USER_COMMAND
复制代码
  1. *&---------------------------------------------------------------------*
  2. *& Form FRM_ALV_TO_CLIPBOARD
  3. *&---------------------------------------------------------------------*
  4. *& text
  5. *&---------------------------------------------------------------------*
  6. *& -->  p1        text
  7. *& <--  p2        text
  8. *&---------------------------------------------------------------------*
  9. FORM frm_alv_to_clipboard .
  10.   DATA: lo_grid         TYPE REF TO cl_gui_alv_grid,
  11.         lt_fieldcat     TYPE lvc_t_fcat,
  12.         ls_fieldcat     TYPE lvc_s_fcat,
  13.         lt_filter       TYPE lvc_t_filt,
  14.         ls_filter       TYPE lvc_s_filt,
  15.         lr_range        TYPE RANGE OF string WITH HEADER LINE,
  16.         l_flag_continue TYPE c.
  17.   DATA: l_type    TYPE c,
  18.         l_index   TYPE i,
  19.         l_cellstr TYPE string,
  20.         l_length  TYPE i,
  21.         l_offset  TYPE i,
  22.         lv_rc     TYPE sy-subrc.
  23.   DATA: BEGIN OF ls_excel,
  24.           row(4096) TYPE c,
  25.         END OF ls_excel,
  26.         lt_excel LIKE TABLE OF ls_excel.
  27.   FIELD-SYMBOLS: <ls_line>, <l_value>.

  28.   CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
  29.     IMPORTING
  30.       e_grid = lo_grid.

  31.   CALL METHOD lo_grid->get_frontend_fieldcatalog
  32.     IMPORTING
  33.       et_fieldcatalog = lt_fieldcat.
  34.   DELETE lt_fieldcat WHERE no_out = 'X'.
  35.   SORT lt_fieldcat BY col_pos.

  36.   CALL METHOD lo_grid->get_filter_criteria
  37.     IMPORTING
  38.       et_filter = lt_filter.

  39. *ALV字段抬头
  40.   CLEAR:ls_excel.
  41.   LOOP AT lt_fieldcat INTO ls_fieldcat.
  42.     IF sy-tabix = 1.
  43.       ls_excel-row = ls_fieldcat-seltext.
  44.     ELSE.
  45.       ls_excel-row = ls_excel-row && cl_abap_char_utilities=>horizontal_tab && ls_fieldcat-seltext.
  46.     ENDIF.
  47.   ENDLOOP.
  48.   APPEND ls_excel TO lt_excel.

  49.   LOOP AT gt_output ASSIGNING <ls_line>.
  50.     CLEAR:l_flag_continue,ls_excel.

  51.     LOOP AT lt_filter INTO ls_filter.
  52.       CLEAR lr_range[].
  53.       lr_range-sign = ls_filter-sign.
  54.       lr_range-option = ls_filter-option.
  55.       lr_range-low = ls_filter-low.
  56.       lr_range-high = ls_filter-high.
  57.       APPEND lr_range.
  58.       ASSIGN COMPONENT ls_filter-fieldname OF STRUCTURE <ls_line> TO <l_value>.
  59.       CHECK sy-subrc = 0.
  60.       IF <l_value> NOT IN lr_range.
  61.         l_flag_continue = 'X'.
  62.       ENDIF.
  63.     ENDLOOP.

  64.     IF l_flag_continue = 'X'.
  65.       CONTINUE.
  66.     ENDIF.

  67.     LOOP AT lt_fieldcat INTO ls_fieldcat.
  68.       l_index = sy-tabix.
  69.       ASSIGN COMPONENT ls_fieldcat-fieldname OF STRUCTURE <ls_line> TO <l_value>.
  70.       CHECK sy-subrc = 0.
  71.       IF ls_fieldcat-fieldname = 'MATNR'.
  72.         CALL FUNCTION 'CONVERSION_EXIT_MATN1_OUTPUT'
  73.           EXPORTING
  74.             input  = <l_value>
  75.           IMPORTING
  76.             output = <l_value>.
  77.       ENDIF.

  78.       DESCRIBE FIELD <l_value> TYPE l_type.
  79.       l_cellstr = <l_value>.
  80.       IF l_type = 'C' OR l_type = 'g'.
  81.         "如果内容中包含“"”,可能会导致输出错误,进行处理
  82.         IF l_cellstr CA cl_abap_char_utilities=>newline.
  83.           l_length = strlen( l_cellstr ).
  84.           IF l_length = 1.
  85.             l_cellstr = '"' && l_cellstr && '"'.
  86.           ELSE.
  87.             l_offset = l_length - 1.
  88.             IF l_cellstr(1) <> '"' OR l_cellstr+l_offset(1) <> '"'.
  89.               REPLACE ALL OCCURRENCES OF '"' IN l_cellstr WITH '""'.
  90.               l_cellstr = '"' && l_cellstr && '"'.
  91.             ENDIF.
  92.           ENDIF.
  93.         ELSE. "不包含换行符时,每个引号全部替换为两个引号 ,并在前后各加引号
  94.           IF l_cellstr CA '"'.
  95.             REPLACE ALL OCCURRENCES OF '"' IN l_cellstr WITH '""'.
  96.             l_cellstr = '"' && l_cellstr && '"'.
  97.           ENDIF.
  98.         ENDIF.
  99.       ELSEIF l_type = 'I' OR l_type = 'P'.
  100.         IF <l_value> < 0.
  101.           l_cellstr = abs( <l_value> ).
  102.           l_cellstr = '-' && l_cellstr.
  103.         ENDIF.
  104.       ENDIF.

  105.       IF l_index = 1.
  106.         ls_excel-row = l_cellstr.
  107.       ELSE.
  108.         ls_excel-row = ls_excel-row && cl_abap_char_utilities=>horizontal_tab && l_cellstr.
  109.       ENDIF.
  110.     ENDLOOP.
  111.     APPEND ls_excel TO lt_excel.
  112.   ENDLOOP.

  113.   CALL METHOD cl_gui_frontend_services=>clipboard_export
  114.     IMPORTING
  115.       data                 = lt_excel
  116.     CHANGING
  117.       rc                   = lv_rc
  118.     EXCEPTIONS
  119.       cntl_error           = 1
  120.       error_no_gui         = 2
  121.       not_supported_by_gui = 3
  122.       no_authority         = 4
  123.       OTHERS               = 5.
  124.   IF sy-subrc = 0.
  125.     MESSAGE '数据复制到剪切板成功!' TYPE 'S'.
  126.   ELSE.
  127.     MESSAGE '数据复制到剪切板失败!' TYPE 'S' DISPLAY LIKE 'E'.
  128.   ENDIF.

  129. ENDFORM.
复制代码
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表