메뉴 건너뛰기

SAP 한국 커뮤니티

[re] 엑셀 MUTIPLE SHEET UPLOAD SAMPLE

슝슝이 2008.08.22 11:03 조회 수 : 3471 추천:10

CODE BY 슝슝이 
THANKS TO MadMax
----------------------------------------


 


REPORT EXCEL_MUTIPLE_SHEET_UPLOAD_TO_INTERNAL_TABLE NO STANDARD PAGE HEADING.
* this report demonstrates how to send some ABAP data to an
* EXCEL sheet using OLE automation.
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_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 .
      i_intern_value = .
      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 .
      i_intern_value = .
      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,
    sheet_per         type i,
    cnt               type i.


*   Ruckgabewert der Methode "clipboard_export     "


* Makro fur Fehlerbehandlung der Methods
  sheet_per = 2.
  cnt = 1.
  REFRESH excel_tab.
  do sheet_per times.


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


    CALL METHOD OF application 'Worksheets' = worksheet EXPORTING #1 = cnt.
    m_message.


    CALL METHOD OF worksheet 'Activate'.
    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
    cnt = cnt + 1.
  enddo.
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
                  9
                  5000.
  LOOP AT GT_UPLOAD.
    WRITE GT_UPLOAD-VALUE.
  ENDLOOP.


번호 제목 글쓴이 날짜 조회 수
410 스크린 페인터 아이콘이 X 로 표시가 되네염..;;; file 피튀긴남 2012.07.06 3453
409 [요청]ALV Tree에서 item 부분의 edit 가능한지요. [3] file Happy~ 2008.05.19 3454
408 T-CODE SMW0 에 대해서 아시는분 없나요? [2] 초보보초보 2007.01.31 3460
407 [re] sql문 in조건 file sapjoy 2007.02.21 3465
406 <b>[완료]</b> ALV에서 currency 타입필드에 Data Change를 했을경우 에러문제입니다... [4] 깁슨매냐 2008.07.23 3465
405 <img src=3.gif>숫자값을 유지하면서 음수 부호를 앞으로 보낼 수 있는 펑션이나 방법 없을까요? [3] 행복을 파는 외계인 2009.12.17 3466
404 <img src=2.gif>abap 배열은 어떻게 선언 하나요? [2] 하늘빛 2010.09.17 3469
403 SELECT SINGLE FOR UPDATE 이 구문이 뭐지요? [3] 노름마치 2007.09.28 3471
» [re] 엑셀 MUTIPLE SHEET UPLOAD SAMPLE 슝슝이 2008.08.22 3471
401 <img src=2.gif>ALV 제목 두줄 나오게 하는 방법 [7] 맨날초보 2010.04.28 3477
400 [요청]ALV에 SEARCH HELP 다는 방법좀 가르쳐 주세요 [1] 123456 2008.09.24 3483
399 [요청]소수점 아래 5자리 까지 표시하는 방법 [2] 준서기 2009.02.25 3483
398 <img src=2.gif>개발클래스 생성하는 방법과 이유는 무엇인지요?? [1] oldboy 2010.07.28 3484
397 SCREEN-COLOR에 관한 질문입니다. [2] 김건태 2007.04.19 3490
396 <img src=3.gif>라벨 프린터(ZEBRA Printer)로 출력 해보시는 분 있나요?_수정본 [3] 버미! 2010.03.02 3490
395 <img src=2.gif>SELECT-OPTIONS Query방법문의 어떤 방법이 있을까요 [2] 하늘 2011.03.29 3490
394 <img src=3.gif border=0>SAP GUI를 통한 접근로그에 대한 확인 방법 문의드립니다. [2] suya1974 2009.08.17 3494
393 <b>[완료]</b>여러개 테이블을 조인하는 방법이 궁금합니다. [5] 아밥초보입니다 2008.08.20 3496
392 [요청]T-Code : dbco 에 대한질문(Unix-Oracle -> NT:MSSQL) 접속가능여부 DBnoid 2008.04.02 3500
391 [요청]using 과 changing 을 알고싶어서요~ [4] 아밥걸 2008.07.15 3504