Upload Excel File Data into Internal Table

*& Report  Z_READ_EXCEL_TO_INTERNAL_TABLE
*&
*&---------------------------------------------------------------------*
*&Purpose: Read excel data to internal table
*&Author: James Zeng
*&March,8 2009
*&---------------------------------------------------------------------*

REPORT  z_read_excel_to_internal_table.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETER:p_infile LIKE rlgrap-filename OBLIGATORY.
SELECTION-SCREEN END  OF BLOCK b1.

DATA: itab1 LIKE alsmex_tabline OCCURS 0 WITH HEADER LINE.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_infile.

*-----------------------------------
* 1.Starting getting the input file.
*-----------------------------------

*-------Way 1------------------------
CALL FUNCTION 'F4_FILENAME'
 EXPORTING
   PROGRAM_NAME        = SYST-CPROG
   DYNPRO_NUMBER       = SYST-DYNNR
   FIELD_NAME          = 'P_INFILE'
 IMPORTING
   FILE_NAME           = p_infile
  .

*--------Way 2----------------------*
*CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
* EXPORTING
*   PROGRAM_NAME        = SYST-REPID
*   DYNPRO_NUMBER       = SYST-DYNNR
*   FIELD_NAME          = 'P_INFILE'
*   STATIC              = ' '
*   MASK                = ' '
*  CHANGING
*    file_name           = p_infile
** EXCEPTIONS
**   MASK_TOO_LONG       = 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.

*---------Way 3-------------------------*
*  CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'
*   EXPORTING
*     def_filename           = ' '
*     def_path               = ' '
*     mask                   = ' '
*     mode                   = ' '
*     title                  = 'Select a file'
*   IMPORTING
*     filename               = p_infile
**   PATH                   =
**   FILE                   =
*   EXCEPTIONS
*     selection_cancel       = 1
*     selection_error        = 2
*     OTHERS                 = 3
*            .
*  IF sy-subrc <> 0.
** MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
**         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
*  ENDIF.


**---------------------------------------------*
**2. Starting getting data from an excel
**file and store it in an internal table.
**---------------------------------------------*
*
**--------------Way 1--------------------------*
** Note: The length of text of Excel cell can't
** extend 50 characters.
**---------------------------------------------*
*
*  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
*    EXPORTING
*      filename                = p_infile
*      i_begin_col             = '1'
*      i_begin_row             = '1'
*      i_end_col               = '16'
*      i_end_row               = '3'
*    TABLES
*      intern                  = itab1
*    EXCEPTIONS
*      inconsistent_parameters = 1
*      upload_ole              = 2
*      OTHERS                  = 3.
*  IF sy-subrc <> 0.
*    MESSAGE e010(zz) WITH text-001. "Problem uploading Excel Spreadsheet
*  ENDIF.
*
* ------------------------------------------------------------------*
* Note: Way (1): convert itab1 data to user defined internal table format
*-------------------------------------------------------------------*
*  FIELD-SYMBOLS : <fs>.
*
*  DATA exception TYPE REF TO cx_root.
*  DATA index TYPE i.
*  DATA: BEGIN OF i_table OCCURS 0, " The number of fields of i_table is equal to the numbers of columns of Excel file
*         value1(50),
*         value2(50),
*        END OF i_table.
*  IF NOT itab1 IS INITIAL.
*    SORT itab1 BY row col.
*  ENDIF.
*  TRY.
*      LOOP AT itab1.
*        MOVE itab1-col TO index.
*        ASSIGN COMPONENT index OF STRUCTURE i_table TO <fs>.
*        MOVE itab1-value TO <fs>.
*        AT END OF row.
*          APPEND i_table TO i_table[]. "user defined internal table to store excel data
*          CLEAR i_table.
*        ENDAT.
*      ENDLOOP.
*    CATCH cx_root INTO exception.
*      MESSAGE 'Excel data format is wrong,please check' TYPE 'E'.
*  ENDTRY.

* ------------------------------------------------------------------*
* Note: Way (2): convert itab1 data to user defined internal table format
*-------------------------------------------------------------------*

*  DATA:  i_currentrow TYPE i.
*  SORT itab1 BY row col.
*
** Get first row retrieved
*  READ TABLE itab1 INDEX 1.
*
**Set first row retrieved to current row
*  i_currentrow = itab1-row.
*
*  LOOP AT itab1.
** Reset values for next row
*    IF itab1-row NE i_currentrow.
*      APPEND i_table .
*      CLEAR i_table.
*      i_currentrow = itab1-row.
*    ENDIF.
*    SHIFT itab1-value LEFT DELETING LEADING space.
*    CASE itab1-col.
*      WHEN '0001'.
*        i_table-value1 = itab1-value.
*      WHEN '0002'.
*        i_table-value2 = itab1-value.
*    ENDCASE.
*  ENDLOOP.
*  APPEND i_table.
*  CLEAR i_table.

*-----------------Way 2-------------------------------*
* Note: The length of text of Excel cell can't
*be more than 256 Characters.
* ----------------------------------------------------*

  TYPE-POOLS: truxs.

  TYPES: BEGIN OF t_datatab, " The number of fields of t_datatab is equal to the numbers of columns of Excel file
        col1(256)    TYPE c,
        col2(256)    TYPE c,
        END OF t_datatab.
  DATA: it_datatab TYPE STANDARD TABLE OF t_datatab WITH HEADER line,
        wa_datatab TYPE t_datatab.

  DATA: it_raw TYPE truxs_t_text_data.


  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
*   I_FIELD_SEPERATOR          =
*   I_LINE_HEADER              =
      i_tab_raw_data             = it_raw       " WORK TABLE
      i_filename                 = p_infile
    TABLES
      i_tab_converted_data       = it_datatab[] "ACTUAL DATA
   EXCEPTIONS
     conversion_failed          = 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.


*-----------------Way 3-------------------------------*
* Note: The length of text of Excel cell can
* be more than 256 Characters.
* This way post from the below link, it is not my idea
* Reference: *http://blog.csdn.net/CompassButton/archive/2007/07/26/1709383.aspx

* ----------------------------------------------------*
*TYPE-POOLS: ole2.
***TYPE UPLOAD TABLE
*TYPES: BEGIN OF zlsmex_tabline,
*          row TYPE kcd_ex_row_n,
*          col TYPE kcd_ex_col_n,
*          value(500),
*       END OF zlsmex_tabline.
*DATA gt_upload  TYPE TABLE OF zlsmex_tabline WITH HEADER LINE.
*
**      value of excel-cell
*TYPES: ty_d_itabvalue             TYPE zlsmex_tabline-value,
**      internal table containing the excel data
*       ty_t_itab                  TYPE zlsmex_tabline   OCCURS 0,
**      line type of sender table
*       BEGIN OF ty_s_senderline,
*         line(4096)               TYPE c,
*       END OF ty_s_senderline,
**      sender table
*       ty_t_sender                TYPE ty_s_senderline  OCCURS 0.
*CONSTANTS:  gc_esc              VALUE '"'.
** handles for OLE objects
*DATA: h_excel       TYPE ole2_object,        " Excel object
*      workbooks     TYPE ole2_object,         " list of workbooks
*      workbook      TYPE ole2_object,          " workbook
*      worksheet     TYPE ole2_object,
*      h_cell        TYPE ole2_object,           " cell
*      h_f           TYPE ole2_object.            " font
*
*DATA  h TYPE i.
**----------------------------------------------------------------------*
** Type Declaration
**----------------------------------------------------------------------*
*TYPE-POOLS: slis, truxs.
*
*PARAMETERS: p_file LIKE rlgrap-filename OBLIGATORY.
*
*DEFINE m_message.
*  case sy-subrc.
*    when 0.
*    when 1.
*      message id sy-msgid type sy-msgty number sy-msgno
*              with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
*    when others.
*      raise upload_ole.
*  endcase.
*END-OF-DEFINITION.
**&---------------------------------------------------------------------*
**&      Form  SEPARATED_TO_INTERN_CONVERT
**&---------------------------------------------------------------------*
**       text
**----------------------------------------------------------------------*
**  -->  p1        text
**  <--  p2        text
**----------------------------------------------------------------------*
*FORM separated_to_intern_convert TABLES i_tab       TYPE ty_t_sender
*                                        i_intern    TYPE ty_t_itab
*                                 USING  i_separator TYPE c.
*  DATA: l_sic_tabix LIKE sy-tabix,
*        l_sic_col   TYPE kcd_ex_col.
*  DATA: l_fdpos     LIKE sy-fdpos.
*
*  REFRESH i_intern.
*
*  LOOP AT i_tab.
*    l_sic_tabix = sy-tabix.
*    l_sic_col = 0.
*    WHILE i_tab CA i_separator.
*      l_fdpos = sy-fdpos.
*      l_sic_col = l_sic_col + 1.
*      PERFORM line_to_cell_separat TABLES i_intern
*                                   USING  i_tab l_sic_tabix l_sic_col
*                                          i_separator l_fdpos.
*    ENDWHILE.
*    IF i_tab <> space.
*      CLEAR i_intern.
*      i_intern-row = l_sic_tabix.
*      i_intern-col = l_sic_col + 1.
*      i_intern-value = i_tab.
*      APPEND i_intern.
*    ENDIF.
*  ENDLOOP.
*ENDFORM.                    " SEPARATED_TO_INTERN_CONVERT
**---------------------------------------------------------------------*
*FORM line_to_cell_separat TABLES i_intern    TYPE ty_t_itab
*                          USING  i_line
*                                 i_row       LIKE sy-tabix
*                                 ch_cell_col TYPE kcd_ex_col
*                                 i_separator TYPE c
*                                 i_fdpos     LIKE sy-fdpos.
*  DATA: l_string   TYPE ty_s_senderline.
*  DATA  l_sic_int  TYPE i.
*
*  CLEAR i_intern.
*  l_sic_int = i_fdpos.
*  i_intern-row = i_row.
*  l_string = i_line.
*  i_intern-col = ch_cell_col.
** csv Dateien mit separator in Zelle: --> ;"abc;cd";
*  IF ( i_separator = ';' OR  i_separator = ',' ) AND
*       l_string(1) = gc_esc.
*    PERFORM line_to_cell_esc_sep USING l_string
*                                       l_sic_int
*                                       i_separator
*                                       i_intern-value.
*  ELSE.
*    IF l_sic_int > 0.
*      i_intern-value = i_line(l_sic_int).
*    ENDIF.
*  ENDIF.
*  IF l_sic_int > 0.
*    APPEND i_intern.
*  ENDIF.
*  l_sic_int = l_sic_int + 1.
*  i_line = i_line+l_sic_int.
*ENDFORM.                    "line_to_cell_separat
*
**---------------------------------------------------------------------*
*FORM line_to_cell_esc_sep USING i_string
*                                i_sic_int      TYPE i
*                                i_separator    TYPE c
*                                i_intern_value TYPE ty_d_itabvalue.
*  DATA: l_int TYPE i,
*        l_cell_end(2).
*  FIELD-SYMBOLS: <l_cell>.
*  l_cell_end = gc_esc.
*  l_cell_end+1 = i_separator .
*
*  IF i_string CS gc_esc.
*    i_string = i_string+1.
*    IF i_string CS l_cell_end.
*      l_int = sy-fdpos.
*      ASSIGN i_string(l_int) TO <l_cell>.
*      i_intern_value = <l_cell>.
*      l_int = l_int + 2.
*      i_sic_int = l_int.
*      i_string = i_string+l_int.
*    ELSEIF i_string CS gc_esc.
**     letzte Celle
*      l_int = sy-fdpos.
*      ASSIGN i_string(l_int) TO <l_cell>.
*      i_intern_value = <l_cell>.
*      l_int = l_int + 1.
*      i_sic_int = l_int.
*      i_string = i_string+l_int.
*      l_int = STRLEN( i_string ).
*      IF l_int > 0 . MESSAGE x001(kx) . ENDIF.
*    ELSE.
*      MESSAGE x001(kx) . "was ist mit csv-Format
*    ENDIF.
*  ENDIF.
*ENDFORM.                    "line_to_cell_esc_sep
**&---------------------------------------------------------------------*
**&      Form  read_excel
**&---------------------------------------------------------------------*
**       text
**----------------------------------------------------------------------*
**  -->  p1        text
**  <--  p2        text
**----------------------------------------------------------------------*
*FORM zalsm_excel_to_internal_table
*    TABLES
*      intern  LIKE  gt_upload[]
*    USING
*       value(filename) LIKE  rlgrap-filename
*       value(i_begin_col) TYPE  i
*       value(i_begin_row) TYPE  i
*       value(i_end_col) TYPE  i
*       value(i_end_row) TYPE  i.
*
*  DATA: excel_tab     TYPE  ty_t_sender.
*  DATA: ld_separator  TYPE  c.
*  DATA: application   TYPE  ole2_object,
*        workbook      TYPE  ole2_object,
*        range         TYPE  ole2_object,
*        worksheet     TYPE  ole2_object.
*  DATA: h_cell        TYPE  ole2_object,
*        h_cell1       TYPE  ole2_object.
*  DATA:
*    ld_rc             TYPE i.
**   Rückgabewert der Methode "clipboard_export     "
*
** Makro für Fehlerbehandlung der Methods
*
** check parameters
*  IF i_begin_row > i_end_row. RAISE inconsistent_parameters. ENDIF.
*  IF i_begin_col > i_end_col. RAISE inconsistent_parameters. ENDIF.
*
** Get TAB-sign for separation of fields
*  CLASS cl_abap_char_utilities DEFINITION LOAD.
*  ld_separator = cl_abap_char_utilities=>horizontal_tab.
*
** open file in Excel
*  IF application-header = space OR application-handle = -1.
*    CREATE OBJECT application 'Excel.Application'.
*    m_message.
*  ENDIF.
*  CALL METHOD OF application 'Workbooks' = workbook.
*  m_message.
*  CALL METHOD OF workbook 'Open' EXPORTING #1 = filename.
*  m_message.
**  set property of application 'Visible' = 1.
**  m_message.
*  GET PROPERTY OF  application 'ACTIVESHEET' = worksheet.
*  m_message.
*
** mark whole spread sheet
*  CALL METHOD OF worksheet 'Cells' = h_cell
*    EXPORTING #1 = i_begin_row #2 = i_begin_col.
*  m_message.
*  CALL METHOD OF worksheet 'Cells' = h_cell1
*    EXPORTING #1 = i_end_row #2 = i_end_col.
*  m_message.
*
*  CALL METHOD OF worksheet 'RANGE' = range
*    EXPORTING #1 = h_cell #2 = h_cell1.
*  m_message.
*  CALL METHOD OF range 'SELECT'.
*  m_message.
*
** copy marked area (whole spread sheet) into Clippboard
*  CALL METHOD OF range 'COPY'.
*  m_message.
*
** read clipboard into ABAP
*  CALL METHOD cl_gui_frontend_services=>clipboard_import
*    IMPORTING
*      data                 = excel_tab
*    EXCEPTIONS
*      cntl_error           = 1
**      ERROR_NO_GUI         = 2
**      NOT_SUPPORTED_BY_GUI = 3
*      OTHERS               = 4
*          .
*  IF sy-subrc <> 0.
*    MESSAGE a037(alsmex).
*  ENDIF.
*
*  PERFORM separated_to_intern_convert TABLES excel_tab intern
*                                      USING  ld_separator.
** clear clipboard
*  REFRESH excel_tab.
*  CALL METHOD cl_gui_frontend_services=>clipboard_export
*     IMPORTING
*        data                 = excel_tab
*     CHANGING
*        rc                   = ld_rc
*     EXCEPTIONS
*        cntl_error           = 1
**       ERROR_NO_GUI         = 2
**       NOT_SUPPORTED_BY_GUI = 3
*        OTHERS               = 4
*          .
*
** quit Excel and free ABAP Object - unfortunately, this does not kill
** the Excel process
*  CALL METHOD OF application 'QUIT'.
*  m_message.
*
** >>>>> Begin of change note 575877
** to kill the Excel process it's necessary to free all used objects
*  FREE OBJECT h_cell.       m_message.
*  FREE OBJECT h_cell1.      m_message.
*  FREE OBJECT range.        m_message.
*  FREE OBJECT worksheet.    m_message.
*  FREE OBJECT workbook.     m_message.
*  FREE OBJECT application.  m_message.
** <<<<< End of change note 575877
*ENDFORM.                    "zalsm_excel_to_internal_table
*
**&---------------------------------------------------------------------*
**&   Event START-OF-SELECTION
**&---------------------------------------------------------------------*
*AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
*  CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
*    EXPORTING
*      mask      = ',Microsoft Excel Files,*.xls'
*      static    = 'X'
*    CHANGING
*      file_name = p_file.
**&---------------------------------------------------------------------*
**&   Event START-OF-SELECTION
**&---------------------------------------------------------------------*
*START-OF-SELECTION.
*  PERFORM zalsm_excel_to_internal_table
*              TABLES
*                 gt_upload
*              USING
*                  p_file
*                  1
*                  1
*                  20
*                  5000.
*  LOOP AT gt_upload.
*    WRITE: / gt_upload-value.
*  ENDLOOP.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章