SAP Excel 操作实现 (CLASS)

*&---------------------------------------------------------------------*
*& Report  ZEXCEL_CLASS_DEMO
*&---------------------------------------------------------------------*
REPORT  zexcel_class_demo.
TABLES: sscrfields,rlgrap.
TYPE-POOLS: slis.

" TEXT-000 : Select file to upload "
" TEXT-001 : Select file "
SELECTION-SCREEN BEGIN OF BLOCK file_name WITH FRAME TITLE text-000.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(31) text-001 FOR FIELD p_file.
PARAMETERS: p_file LIKE rlgrap-filename .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK file_name.

SELECTION-SCREEN FUNCTION KEY 1.

TYPES: BEGIN OF tp_template,
  pspid  TYPE proj-pspid,   " Project Definition "
*  stufe  TYPE prps-stufe,  " Level in Project Hierarchy "
  posid  TYPE prps-posid,   " WBS Element "
  post1  TYPE prps-post1,   " WBS Element Desc "
*  wbs_up   TYPE ps_posid,  " WBS Up Level Element "
*  wbs_left TYPE ps_posid,  " WBS Up Element "
  usr00  TYPE prps-usr00,   " Cost Category "
  usr01  TYPE prps-usr01,   " Cost Item "
  usr02  TYPE prps-usr02,   " Cost Type "
  usr03  TYPE prps-usr03,   " Capex/Opex "
  belkz TYPE prps-belkz,    " Acct asst elem "
  fakkz TYPE prps-fakkz,    " Billing element "
END OF tp_template.
DATA: gt_template TYPE STANDARD TABLE OF tp_template.

INITIALIZATION.
  PERFORM frm_init_screen.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM frm_get_filename CHANGING p_file.

AT SELECTION-SCREEN.
  IF sscrfields-ucomm EQ 'FC01'.
    " 从服务器(SMW0)下载模板 "
    PERFORM frm_download_file.
  ELSEIF sscrfields-ucomm EQ 'ONLI'.
    " 查看本地文件是否存在 "
    PERFORM frm_check_file.
  ENDIF.

START-OF-SELECTION.
  PERFORM frm_get_data.
*&---------------------------------------------------------------------*
*&      Form  FRM_INIT_SCREEN
*&---------------------------------------------------------------------*
FORM frm_init_screen .
  DATA gs_dyntxt TYPE smp_dyntxt.
  gs_dyntxt-icon_id = '@49@'.
  gs_dyntxt-quickinfo = 'Download Template'.
  gs_dyntxt-icon_text = 'Download Template'.
  sscrfields-functxt_01 = gs_dyntxt.
ENDFORM.                    " FRM_INIT_SCREEN "
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_FILENAME
*&---------------------------------------------------------------------*
FORM frm_get_filename  CHANGING p_file.
  DATA: lt_file TYPE filetable,
        lv_rc   TYPE i.

  CALL METHOD cl_gui_frontend_services=>file_open_dialog
    EXPORTING
      window_title            = '选择上传文件'
      default_extension       = '*.XLS'
      file_filter             = 'All Files (*.*)|*.*|NotePad Files(*.txt)|*.txt 
                                |Excel Files(*.xls)|*.xls|Word files(*.doc)|*.doc'
      initial_directory       = 'C:/'  "初始化的目录"
*      default_filename        =
*      with_encoding           =
*      multiselection          = 'X'       "是否可以同时打开多个文件"
    CHANGING
      file_table              = lt_file  "你打开文件名的列表"
      rc                      = lv_rc    "返回打开文件的数量"
*      user_action             =
*      file_encoding           =
    EXCEPTIONS
      file_open_dialog_failed = 1
      cntl_error              = 2
      error_no_gui            = 3
      not_supported_by_gui    = 4
      OTHERS                  = 5
          .
  IF sy-subrc EQ 0 AND lv_rc EQ 1.
    READ TABLE lt_file INDEX 1 INTO p_file.
  ENDIF.
ENDFORM.                    " FRM_GET_FILENAME "
*&---------------------------------------------------------------------*
*&      Form  FRM_DOWNLOAD_FILE
*&---------------------------------------------------------------------*
FORM frm_download_file .
  DATA: ls_filekey  TYPE wwwdatatab,
        lt_mime     TYPE STANDARD TABLE OF w3mime,
        lt_param    TYPE STANDARD TABLE OF wwwparams,
        ls_param    TYPE wwwparams,
        lv_filesize TYPE i.
  DATA: lv_filefilter       TYPE string,
        lv_default_filename TYPE string,
        lv_filename         TYPE string,
        lv_path             TYPE string,
        lv_fullpath         TYPE string,
        lv_user_action      TYPE i.
  " 判断服务器模板是否存在,并获取模板内容 "
  ls_filekey-relid = 'MI'.
  ls_filekey-objid = 'ZPSR_UPLOAD_WBS'.
  CALL FUNCTION 'WWWDATA_IMPORT'
    EXPORTING
      key               = ls_filekey
    TABLES
      mime              = lt_mime
    EXCEPTIONS
      wrong_object_type = 1
      import_error      = 2
      OTHERS            = 3.
  IF sy-subrc <> 0.
    MESSAGE 'Template is not exist' TYPE 'E'.
    RETURN.
  ENDIF.
  " 弹出下载框函数,确定下载路径 "
  CALL METHOD cl_gui_frontend_services=>file_save_dialog
    EXPORTING
      default_file_name    = 'Test_Template.XLSX'
    CHANGING
      filename             = lv_filename
      path                 = lv_path
      fullpath             = lv_fullpath
      user_action          = lv_user_action
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF sy-subrc <> 0.
    MESSAGE 'Please choose save path' TYPE 'I'.
    STOP.
  ENDIF.
  " 保存文件到选择的下载路径 "
  SELECT * FROM wwwparams
    INTO CORRESPONDING FIELDS OF TABLE lt_param
    WHERE relid = ls_filekey-relid
    AND objid = ls_filekey-objid.
  READ TABLE lt_param INTO ls_param WITH KEY name = 'filesize'.
  IF sy-subrc EQ 0.
    lv_filesize = ls_param-value.
  ENDIF.

  IF lv_user_action EQ cl_gui_frontend_services=>action_ok.
    CALL METHOD cl_gui_frontend_services=>gui_download
      EXPORTING
        bin_filesize = lv_filesize
        filename     = lv_fullpath
        filetype     = 'BIN'
      CHANGING
        data_tab     = lt_mime.
    IF sy-subrc <> 0.
      MESSAGE 'Error occurs when download' TYPE 'E'.
      RETURN.
    ENDIF.
  ENDIF.
ENDFORM.                    " FRM_DOWNLOAD_FILE "
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_FILE
*&---------------------------------------------------------------------*
FORM frm_check_file .
  DATA:lv_filename TYPE string,
        lv_result TYPE c.
  lv_filename = p_file.
  CALL METHOD cl_gui_frontend_services=>file_exist
    EXPORTING
      file                 = lv_filename
    RECEIVING
      result               = lv_result
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      wrong_parameter      = 3
      not_supported_by_gui = 4
      OTHERS               = 5.
  IF sy-subrc NE 0.
  ENDIF.
  IF lv_result = ''.
    MESSAGE 'The File Not Found In The Direct!' TYPE 'E'.
  ENDIF.
ENDFORM.                    " FRM_CHECK_FILE "
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
FORM frm_get_data .
  DATA: lt_intern TYPE STANDARD TABLE OF alsmex_tabline,
        ls_intern LIKE LINE OF lt_intern.
  DATA: ls_template LIKE LINE OF gt_template,
        lv_index  LIKE sy-tabix.
  FIELD-SYMBOLS: <fv_value> .
  " 将Excel数据转换到内表数据
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 50
      i_end_row               = 65536
    TABLES
      intern                  = lt_intern
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    MESSAGE 'Excel parsing failed' TYPE 'S' DISPLAY LIKE 'E' .
    LEAVE LIST-PROCESSING.
  ENDIF.

  LOOP AT lt_intern INTO ls_intern.
    lv_index = ls_intern-col.
    UNASSIGN <fv_value>.
    ASSIGN COMPONENT lv_index OF STRUCTURE ls_template TO <fv_value>.
    MOVE ls_intern-value TO <fv_value>.
    AT END OF row.
      APPEND ls_template TO gt_template.
      CLEAR: ls_template.
    ENDAT.
    CLEAR:ls_intern.
  ENDLOOP.

  CHECK gt_template[] IS NOT INITIAL.
ENDFORM.                    " FRM_GET_DATA "