ABAP 通用批导EXCLE数据到数据库表

该篇文章详细描述了一个ABAP程序的过程,包括从Excel文件中读取数据并将其转换为内部表结构,使用ALV功能展示数据,以及用户命令实现数据的保存。重点在于使用`ALSM_EXCEL_TO_INTERNAL_TABLE`函数处理Excel数据和ALV的动态表格显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*&---------------------------------------------------------------------*
*& Report  ZTY_001
*&
*&---------------------------------------------------------------------*
REPORT zty_001.

*TYPE-POOLS:slis,abap.

DATA: BEGIN OF iexcel OCCURS 0.
        INCLUDE STRUCTURE alsmex_tabline.
DATA: END OF iexcel.

DATA: i_index TYPE i.
FIELD-SYMBOLS: <fs>.



*-----------
DATA: d_ref      TYPE REF TO data,

      lt_alv_cat TYPE TABLE OF lvc_s_fcat,

      ls_alv_cat LIKE LINE OF lt_alv_cat.


DATA: lt_table LIKE TABLE OF dntab.

DATA: ls_table TYPE dntab.


DATA: dyn_table TYPE REF TO data.

DATA: dyn_wa TYPE REF TO data.


FIELD-SYMBOLS :

  <dyn_table> TYPE table,

  <dyn_wa>    TYPE any,

  <dyn_field> TYPE any,

  <fs_str>    TYPE any.


*-------------------------------------------
PARAMETERS: p_fname LIKE rlgrap-filename MEMORY ID m01. " 获取文件路径
PARAMETERS: p_table  TYPE tabname,
            p_begrow TYPE i DEFAULT 2, "开始行
            p_begcol TYPE i DEFAULT 1. "开始列

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_fname.
  PERFORM get_field.


START-OF-SELECTION.
  PERFORM get_table.
  PERFORM upload.
  PERFORM alv_show.

*&---------------------------------------------------------------------*
*&      Form  get_field
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM get_field.


  CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
*     DEF_FILENAME     = ' '
*     DEF_PATH         = ' '
      mask             = 'Excel Files,*.xls,All Files,*.csv,*.*.'
*     MODE             = ' '
      title            = '请选择要导入的格式'
    IMPORTING
      filename         = p_fname
*     RC               =
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.
  IF sy-subrc <> 0.
    WRITE: '导入数据出错'.
  ENDIF.

ENDFORM.                    "get_field


*&---------------------------------------------------------------------*
*&      Form  upLOAD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM upload.

  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_fname
      i_begin_col             = 1
      i_begin_row             = p_begrow
      i_end_col               = 100
      i_end_row               = 10000
    TABLES
      intern                  = iexcel
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    WRITE:sy-subrc.
  ELSE.
    SELECT SINGLE dcpfm INTO @DATA(l_dcpfm)
      FROM usr01
      WHERE bname = @sy-uname.

    p_begcol = 1 - ( p_begcol - 1 ).

    LOOP AT iexcel.

      " WRITE:IEXCEL-COL.
      MOVE iexcel-col TO i_index.
      i_index = i_index + p_begcol.
      ASSIGN COMPONENT i_index OF STRUCTURE <dyn_wa> TO <fs> .
      IF <fs> IS ASSIGNED.
        MOVE iexcel-value TO <fs>.
        READ TABLE lt_table INTO ls_table INDEX i_index.
        IF sy-subrc = 0.
          CASE ls_table-inttype.
            WHEN 'D'.
*              CALL FUNCTION 'ZCONVERT_DATE_TO_INPUT'
*                EXPORTING
*                  im_datext = iexcel-value
*                IMPORTING
*                  ex_datint = <fs>
**                 EX_DATFMUSED       =
**                 EV_MSGTY  =
**                 EV_MSGTXT =
*                .

            WHEN 'T'.
              cl_abap_timefm=>conv_time_ext_to_int(
                EXPORTING
                  time_ext      = iexcel-value                " External Represenation of Time
                  is_24_allowed = abap_false       " Is 24:00 permitted?
                IMPORTING
                  time_int      = <fs>                " Internal Represenation of Time
              ).

            WHEN 'P'.
              CASE l_dcpfm.
                WHEN ''.
                  REPLACE ALL OCCURRENCES OF '.' IN iexcel-value WITH '' .
                  REPLACE ',' IN iexcel-value WITH '.' .
                  CONDENSE iexcel-value NO-GAPS.
                WHEN 'Y'."小数点是逗号
                  REPLACE ',' IN iexcel-value WITH '.' .
                  CONDENSE iexcel-value NO-GAPS.
                WHEN 'X'."小数点是逗号
                  REPLACE ALL OCCURRENCES OF ',' IN iexcel-value WITH '' .
                  CONDENSE iexcel-value NO-GAPS.
                WHEN OTHERS.
              ENDCASE.
              <fs> = iexcel-value.
            WHEN OTHERS.
          ENDCASE.
        ENDIF.
      ENDIF.
      AT END OF row.
        APPEND <dyn_wa> TO <dyn_table>.
        CLEAR: <dyn_wa> .
        " APPEND IM_TAB.  "在每一行结束时
        " CLEAR IM_TAB.
      ENDAT.

    ENDLOOP.

  ENDIF.


ENDFORM.                    "upLOAD



*&---------------------------------------------------------------------*
*&      Form  get_table
*&---------------------------------------------------------------------*
*       text  获取内表结构
*----------------------------------------------------------------------*
FORM get_table.
*取出表结构的字段目录
  CALL FUNCTION 'NAMETAB_GET'
    EXPORTING
      langu          = sy-langu
      tabname        = p_table
    TABLES
      nametab        = lt_table
    EXCEPTIONS
      no_texts_found = 1.


*根据取出的字段目录生成参考字段目录

  LOOP AT lt_table INTO ls_table.

    ls_alv_cat-fieldname = ls_table-fieldname.

    ls_alv_cat-ref_table = p_table.

    ls_alv_cat-ref_field = ls_table-fieldname.

    APPEND ls_alv_cat TO lt_alv_cat.

    CLEAR ls_alv_cat.

  ENDLOOP.

*    内表创建

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = lt_alv_cat
    IMPORTING
      ep_table        = d_ref.

*    指定生成的内表到字段符号
  ASSIGN d_ref->* TO <dyn_table>.
*    创建动态工作区结构
  CREATE DATA dyn_wa LIKE LINE OF <dyn_table>.
*    创建动态工作区
  ASSIGN dyn_wa->* TO <dyn_wa>.

ENDFORM.                    "get_table




*&---------------------------------------------------------------------*
*&      Form  ALV_SHOW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM alv_show.
*显示内表中的数据
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_structure_name         = p_table
      i_callback_program       = sy-repid
      i_callback_pf_status_set = 'SET_PF_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
    TABLES
      t_outtab                 = <dyn_table>
    EXCEPTIONS
      program_error            = 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.
ENDFORM.                    "ALV_SHOW
FORM set_pf_status USING rt_extab TYPE slis_t_extab.
  SET PF-STATUS 'STANDARD' EXCLUDING rt_extab.
ENDFORM.
FORM user_command  USING r_ucomm LIKE sy-ucomm
                                   rs_selfield TYPE slis_selfield.
  CASE r_ucomm.
    WHEN 'ZSAV'.
      MODIFY (p_table) FROM TABLE <dyn_table>.
      IF sy-subrc EQ 0.
        COMMIT WORK AND WAIT.
        MESSAGE '保存成功' TYPE 'S'.
      ELSE.
        ROLLBACK WORK.
        MESSAGE '保存失败,请检查数据是否有误' TYPE 'S' DISPLAY LIKE 'E'.
      ENDIF.
    WHEN OTHERS.
  ENDCASE.
ENDFORM.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值