*& 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.