SAP ABAP万能EXCEL批导

文章讲述了如何使用代码自动导入Excel数据到ALV表格,支持字段自定义和扩展功能。

前言:

    程序自动根据导入数据生成alv数据,不需要定义内表和字段。

  功能实现: 

     1、导入数据从Excel的第一行,第一列开始。其中第一行取的值为alv的字段描述。

     2、因为标准函数ALSM_EXCEL_TO_INTERNAL_TABLE 里面的结构

          ALSMEX_TABLINE-VALUE字段太短,一般复制一个标准的出来改一下。

     3、次功能单纯的批导,如果需要添加按钮功能等,可以自行添加。

     4、此功能可以自行添加字段,比如可选行,消息文本等。

    效果如下:

      

 代码如下: 

*&---------------------------------------------------------------------*
*& Report ZABAP_EXCEL_INPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zabap_excel_input.

"选择屏幕
DATA: g_repid     LIKE sy-repid,
      it_fieldcat TYPE lvc_t_fcat WITH HEADER LINE,
      is_layout   TYPE lvc_s_layo.
FIELD-SYMBOLS:
  <dyn_wa>    TYPE any, "工作区
  <dyn_table> TYPE STANDARD TABLE. "内表指针

SELECTION-SCREEN BEGIN OF BLOCK 001 WITH FRAME TITLE title1.
  PARAMETERS: p_file LIKE rlgrap-filename.
  SELECTION-SCREEN SKIP.
  SELECTION-SCREEN COMMENT /1(79) cmt1.
  SELECTION-SCREEN COMMENT /2(79) cmt2.
SELECTION-SCREEN END OF BLOCK 001 .

AT SELECTION-SCREEN  OUTPUT .
  %_p_file_%_app_%-text = '文件导入地址'.

INITIALIZATION.
  cmt1 = '注意:' .
  cmt2 = 'EXCEL导入数据格式:数据导入从第一行,第一列开始。第一行为ALV字段描述' .
*----------------------------------------------------------------------*
*          AT SELECTION-SCREEN)                                        *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM file_input CHANGING p_file .

START-OF-SELECTION.
  PERFORM update_excel.
  PERFORM alv_show.
*&---------------------------------------------------------------------*
*& Form file_input
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      <-- P_FILE
*&---------------------------------------------------------------------*
FORM file_input  CHANGING p_p_file.
  DATA:lt_tab         TYPE filetable,         "存放文件名的内表
       lv_file_filter TYPE string,            "file filter
       lv_rc          TYPE i.                 "函数返回值

  REFRESH:lt_tab.
  CLEAR:lv_file_filter,lv_rc.
  lv_file_filter = 'EXCEL文件|*.XLS;*.XLSX'.
  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = '选择数据文件'
      file_filter             = lv_file_filter
*     initial_directory       = 'C:\'
    CHANGING
      file_table              = lt_tab
      rc                      = lv_rc
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5.

  IF sy-subrc = 0 AND lv_rc = 1.
    READ TABLE lt_tab INTO p_file INDEX 1.
  ELSE.
    MESSAGE '没有选择文件或是选择文件错误!' TYPE 'S'.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form update_excel
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM update_excel.
  DATA:lt_excel TYPE TABLE OF zalsmex_tabline.
  DATA ls_excel LIKE LINE OF lt_excel.
  DATA sum_row TYPE i.
  DATA sum_tbx TYPE i.

  FIELD-SYMBOLS: "<dyn_table> TYPE STANDARD TABLE, "内表指针
    <dyn_name>  TYPE any, "工作区
    <dyn_field> TYPE any, "字段
    <fs>        TYPE any, "字段
    <fs_name>   TYPE any. "字段
  DATA:dy_table TYPE REF TO data,
       dy_line  TYPE REF TO data,  "行
       wa_fcat  TYPE lvc_s_fcat,   "列结构
       it_fcat  TYPE lvc_t_fcat.
  DATA lt_table TYPE TABLE OF dfies. "字段结构表
  DATA ls_table TYPE dfies.


  DATA:
    dref_tab    TYPE REF TO data,
    itab_type   TYPE REF TO cl_abap_tabledescr,
    struct_type TYPE REF TO cl_abap_structdescr,
    elem_type   TYPE REF TO cl_abap_elemdescr,
    table_type  TYPE REF TO cl_abap_tabledescr,
    comp_tab    TYPE cl_abap_structdescr=>component_table WITH HEADER LINE.

  IF p_file IS INITIAL.
    MESSAGE '导入数据不能为空' TYPE 'S' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ELSE.
**上传数据
    CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
      EXPORTING
        filename                = p_file
        i_begin_col             = 1
        i_begin_row             = 1
        i_end_col               = 99
        i_end_row               = 19999
        sheet_name              = ''
      TABLES
        intern                  = lt_excel
      EXCEPTIONS
        inconsistent_parameters = 1
        upload_ole              = 2
        OTHERS                  = 3.
    IF sy-subrc <> 0.
* implement suitable error handling here
    ENDIF.

    DATA(lt_data) = lt_excel[].
    DELETE lt_data WHERE row <> '0001'.

    "统计导入字段总数
    CLEAR sum_row.
    DESCRIBE TABLE lt_data LINES sum_row .
    "获取字段名
    IF sum_row > 1.
      CLEAR sum_tbx.
      DO sum_row TIMES.
        sum_tbx = sum_tbx + 1.
* 向结构中动态的新增一个成员
        wa_fcat-fieldname = 'COL' && sum_tbx.
        APPEND wa_fcat TO it_fcat.
        CLEAR wa_fcat.
      ENDDO.
    ENDIF.

    CALL METHOD cl_alv_table_create=>create_dynamic_table
      EXPORTING
        it_fieldcatalog = it_fcat
      IMPORTING
        ep_table        = dy_table.
    ASSIGN dy_table->* TO <dyn_table>.
    CREATE DATA dy_line LIKE LINE OF <dyn_table>.
    ASSIGN dy_line->* TO <dyn_wa>.
    ASSIGN dy_line->* TO <dyn_name>.

    "给现有的内表加选择行
    table_type ?= cl_abap_tabledescr=>describe_by_data( <dyn_table> ).

    struct_type ?= table_type->get_table_line_type( ).

    comp_tab[] = struct_type->get_components( ).

    comp_tab-name = 'SEL'.
    comp_tab-type = cl_abap_elemdescr=>get_c( 1 ).
    INSERT comp_tab INTO comp_tab INDEX sum_row + 1.

    struct_type = cl_abap_structdescr=>create( comp_tab[] ).
    itab_type = cl_abap_tabledescr=>create( struct_type ).
    CREATE DATA dref_tab TYPE HANDLE itab_type.
    ASSIGN dref_tab->* TO <dyn_table>.



    LOOP AT lt_excel INTO ls_excel.
      IF ls_excel-row = '0001'.
        ASSIGN COMPONENT ls_excel-col OF STRUCTURE <dyn_name> TO <fs_name>.
        CONDENSE ls_excel-value NO-GAPS.                  " 去掉空格
        <fs_name> = ls_excel-value.
        SEARCH <fs_name> FOR '日期' .
        IF sy-subrc = 0.
          it_fieldcat-inttype = 'D'.
        ENDIF.
        SEARCH <fs_name> FOR '时间'.
        IF sy-subrc = 0.
          it_fieldcat-inttype = 'T'.
        ENDIF.

        it_fieldcat-fieldname = 'COL' && sy-tabix.
        it_fieldcat-tabname   = '<DYN_TABLE>'.
        it_fieldcat-coltext   = <fs_name>.
        it_fieldcat-just = 'C'.
        APPEND  it_fieldcat.
        CLEAR  it_fieldcat.
      ELSE.
        ASSIGN COMPONENT ls_excel-col OF STRUCTURE <dyn_wa> TO <fs>.
        CONDENSE ls_excel-value NO-GAPS.                  " 去掉空格
        <fs> = ls_excel-value.
      ENDIF.
      AT END OF row.
        IF ls_excel-row <> '0001'.
          APPEND <dyn_wa> TO <dyn_table>.
        ENDIF.
      ENDAT.
    ENDLOOP.
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form alv_show
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM alv_show .

  is_layout-zebra      = 'X'.   "明亮显示
  is_layout-cwidth_opt = 'X'.   "自动列宽
  is_layout-box_fname = 'SEL'.

  g_repid = sy-repid.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_callback_program = g_repid
*     I_CALLBACK_PF_STATUS_SET          = ' '
*     I_CALLBACK_USER_COMMAND           = ' '
      is_layout_lvc      = is_layout
      it_fieldcat_lvc    = it_fieldcat[]
    TABLES
      t_outtab           = <dyn_table>
    EXCEPTIONS
      program_error      = 1
      OTHERS             = 2.
ENDFORM.

添加字段位置:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值