SAP中导入Excel数据的方法有很多,这里只罗列一下我工作中用到的一些方法

第一步 获取文件路径

方法一

CALL FUNCTION 'WS_FILENAME_GET'
    EXPORTING
      def_path         = 'C'
      mask             = ',Excel,*.XLSX;*.XLS.'
      title            = '选择文件'
    IMPORTING
      filename         = p_file
    EXCEPTIONS
      inv_winsys       = 1
      no_batch         = 2
      selection_cancel = 3
      selection_error  = 4
      OTHERS           = 5.

  IF sy-subrc  0 AND sy-subrc = 3.
    MESSAGE '选择文件出错' TYPE 'I' DISPLAY LIKE 'E'.
    STOP.
  ENDIF.

方法二

*这个方法可以用于web GUI数据导入,返回的path其实是浏览器缓存路径
*配合GUI_UPLOAD、SCMS_BINARY_TO_XSTRING、cl_fdt_xl_spreadsheet完成数据导入
FORM get_filename_n .
  DATA: lv_rc TYPE i.
  DATA: lt_file_table TYPE filetable,
        ls_file_table TYPE file_table.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title = 'Select a file'
    CHANGING
      file_table   = lt_file_table
      rc           = lv_rc.
  IF sy-subrc = 0.
    READ TABLE lt_file_table INTO ls_file_table INDEX 1.
    p_file = ls_file_table-filename.
  ENDIF.

ENDFORM.

第二步 导入Excel数据

方法一

1. WebGui无法使用;
2. 导入数据长度受alsmex_tabline限制,最长50位.可以通过调整参照自定义长度

DATA BEGIN OF iexcel OCCURS 0.  " excel上载内表
INCLUDE STRUCTURE alsmex_tabline.
DATA END OF iexcel.
*上载excel文件
CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
  EXPORTING
    filename                = p_file "文件路径
    i_begin_col             = 1
    i_begin_row             = l_header "开始行
    i_end_col               = 50
    i_end_row               = 5000
  TABLES
    intern                  = iexcel
  EXCEPTIONS
    inconsistent_parameters = 1
    upload_ole              = 2
    OTHERS                  = 3.
IF sy-subrc <> 0.
  WRITE: / 'EXCEL UPLOAD FAILED ', p_file, sy-subrc.
  STOP.
ELSE.
  SORT iexcel BY row col.
ENDIF.

方法二

function示例代码

  FIELD-SYMBOLS : <gt_data>  TYPE STANDARD TABLE,
                  <ls_data>  TYPE any,
                  <lv_field> TYPE any,
                  <lv_row>   TYPE any,
                  <lv_col>   TYPE any,
                  <lv_value> TYPE any,
                  <lt_excel> TYPE STANDARD TABLE,
                  <ls_excel> TYPE any
                  .
  DATA : lv_filename      TYPE string,
         lv_headerxstring TYPE xstring,
         lv_filelength    TYPE i,
         lt_records       TYPE solix_tab,
         lt_data          TYPE REF TO data,
         ls_data          TYPE REF TO data.

*第一步、把Excel的二进制文件导入到系统中
CALL FUNCTION 'GUI_UPLOAD'
    EXPORTING
      filename                = lv_filename
      filetype                = 'BIN'
    IMPORTING
      filelength              = lv_filelength
      header                  = lv_headerxstring
    TABLES
      data_tab                = lt_records
    EXCEPTIONS
      file_open_error         = 1
      file_read_error         = 2
      no_batch                = 3
      gui_refuse_filetransfer = 4
      invalid_type            = 5
      no_authority            = 6
      unknown_error           = 7
      bad_data_format         = 8
      header_not_allowed      = 9
      separator_not_allowed   = 10
      header_too_long         = 11
      unknown_dp_error        = 12
      access_denied           = 13
      dp_out_of_memory        = 14
      disk_full               = 15
      dp_timeout              = 16
      OTHERS                  = 17.
	  
*第二步、二进制数据转换为xstring
  "convert binary data to xstring
  "if you are using cl_fdt_xl_spreadsheet in odata then skips this step
  "as excel file will already be in xstring
  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      input_length = lv_filelength
    IMPORTING
      buffer       = lv_headerxstring
    TABLES
      binary_tab   = lt_records
    EXCEPTIONS
      failed       = 1
      OTHERS       = 2.

*第三步、解析
  DATA : lo_excel_ref  TYPE REF TO cl_fdt_xl_spreadsheet,
         lr_excel_core TYPE REF TO  cx_fdt_excel_core
         .

  TRY .
      lo_excel_ref = NEW cl_fdt_xl_spreadsheet(
                              document_name = lv_filename
                              xdocument     = lv_headerxstring ) .
    CATCH cx_fdt_excel_core INTO lr_excel_core .
      "Implement suitable error handling here
      DATA(lt_msg) = lr_excel_core->mt_message.
  ENDTRY .

  "Get List of Worksheets
  lo_excel_ref->if_fdt_doc_spreadsheet~get_worksheet_names(
    IMPORTING
      worksheet_names = DATA(lt_worksheets) ).

  IF NOT lt_worksheets IS INITIAL.
    READ TABLE lt_worksheets INTO DATA(lv_woksheetname) INDEX i_sheets_num .

    DATA(lo_data_ref) = lo_excel_ref->if_fdt_doc_spreadsheet~get_itab_from_worksheet(
                                             lv_woksheetname ).
    "now you have excel work sheet data in dyanmic internal table
    ASSIGN lo_data_ref->* TO <gt_data>.

  ENDIF .