본문 바로가기

ABAP

엑셀 업로드(GUI_UPLOAD)

반응형

업로드 할 엑셀 파일 템플릿을 준비한다. ▼

 

엑셀 데이터를 담기 위한 테이블을 선언한다. 타입은 CHAR로 선언▼

TYPES: BEGIN OF TY_EXCEL,
         KOKRS(50),
         KOSTL(50),
         WKG001(50),
         WKG002(50),
         WKG003(50),
         WKG004(50),
         WKG005(50),
         WKG006(50),
         WKG007(50),
         WKG008(50),
         WKG009(50),
         WKG010(50),
         WKG011(50),
         WKG012(50),
       END OF TY_EXCEL.
TYPES: TTY_EXCEL TYPE TABLE OF TY_EXCEL.

DATA: GT_EXCEL TYPE TTY_EXCEL.

 

엑셀 업로드할 파일경로를 받을 파라미터를 선언한다. ▼

  PARAMETERS : P_FILE TYPE LOCALFILE DEFAULT 'C:\' OBLIGATORY.

 

엑셀 업로드 METHOD 소스를 추가한다. ▼

PERFORM UPLOAD_EXCEL_DATA.

*&---------------------------------------------------------------------*
*& Form UPLOAD_EXCEL_DATA
*&---------------------------------------------------------------------*
*& GT_EXCEL, P_FILE TOP 변경
*&---------------------------------------------------------------------*
FORM UPLOAD_EXCEL_DATA .

  DATA: LV_BIN_SIZE TYPE I,
        LT_BIN_TAB  TYPE W3MIMETABTYPE,
        LV_XSTRING  TYPE XSTRING.

  CL_GUI_FRONTEND_SERVICES=>GUI_UPLOAD(
    EXPORTING
      FILENAME   = CONV STRING( P_FILE )
      FILETYPE   = 'BIN'
    IMPORTING
      FILELENGTH = LV_BIN_SIZE
      HEADER     = LV_XSTRING
    CHANGING
      DATA_TAB   = LT_BIN_TAB
     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 "Excel 파일 열고 실행시 출력되는 오류
      ACCESS_DENIED                 = 13
      DP_OUT_OF_MEMORY              = 14
      DISK_FULL                     = 15
      DP_TIMEOUT                    = 16
      OTHERS                        = 17 ).
  IF SY-SUBRC <> 0.
    MESSAGE S398(00) WITH '파일 열기 실패' DISPLAY LIKE 'E'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  CALL FUNCTION 'SCMS_BINARY_TO_XSTRING'
    EXPORTING
      INPUT_LENGTH = LV_BIN_SIZE
    IMPORTING
      BUFFER       = LV_XSTRING
    TABLES
      BINARY_TAB   = LT_BIN_TAB.

*&---------------------------------------------------------------------*
*& 데이터 변환 / 첫 행,열 변경(LV_FIRST_ROW, LV_FIRST_COL)
*&---------------------------------------------------------------------*
  DATA: LO_XLSX      TYPE REF TO CL_EHFND_XLSX,
        LO_DOC       TYPE REF TO IF_EHFND_XLSX_DOC,
        LO_SHEET     TYPE REF TO IF_EHFND_XLSX_SHEET,
        LT_SHEETS    TYPE CL_EHFND_XLSX=>GTY_TH_SHEET_INFO,
        LS_SHEETS    LIKE LINE OF LT_SHEETS,
        LV_FIRST_ROW TYPE I VALUE 2,
        LV_FIRST_COL TYPE I VALUE 1,
        LV_LAST_ROW  TYPE I,
        LV_LAST_COL  TYPE I,
        LV_ROW       TYPE I,
        LV_COL       TYPE I,
        LV_STRUC_INX TYPE I,
        LV_DATA      TYPE STRING,
        LO_CX_ROOT   TYPE REF TO CX_ROOT.

  FIELD-SYMBOLS: <LS_TABLE> TYPE ANY,
                 <LV_COMP>  TYPE ANY.

  CHECK LV_XSTRING IS NOT INITIAL.
  LO_XLSX = CL_EHFND_XLSX=>GET_INSTANCE( ).

  TRY.
      LO_DOC  = LO_XLSX->LOAD_DOC( IV_FILE_DATA = LV_XSTRING ).

      LT_SHEETS = LO_DOC->GET_SHEETS( ).

      READ TABLE LT_SHEETS INTO LS_SHEETS INDEX 1.

      LO_SHEET = LO_DOC->GET_SHEET_BY_NAME( LS_SHEETS-NAME ).

      LV_LAST_ROW = LO_SHEET->GET_LAST_ROW_NUMBER( ).

      DO LV_LAST_ROW TIMES.

        APPEND INITIAL LINE TO GT_EXCEL ASSIGNING <LS_TABLE>.

        LV_ROW      = SY-INDEX + LV_FIRST_ROW - 1.
        LV_LAST_COL = LO_SHEET->GET_LAST_COLUMN_NUMBER_IN_ROW( LV_ROW ).

        DO LV_LAST_COL TIMES.

          LV_COL = SY-INDEX + LV_FIRST_COL - 1.
          LV_STRUC_INX = SY-INDEX.

          LV_DATA = LO_SHEET->GET_CELL_CONTENT( IV_ROW = LV_ROW IV_COLUMN = LV_COL ).

          ASSIGN COMPONENT LV_STRUC_INX OF STRUCTURE <LS_TABLE> TO <LV_COMP>.

          IF SY-SUBRC = 0.
            <LV_COMP> = LV_DATA.
          ENDIF.

        ENDDO.

        IF <LS_TABLE> IS INITIAL.
          DELETE TABLE GT_EXCEL FROM <LS_TABLE>.
        ENDIF.

      ENDDO.

    CATCH CX_ROOT INTO LO_CX_ROOT.
      CL_MESSAGE_HELPER=>SET_MSG_VARS_FOR_CLIKE( LO_CX_ROOT->GET_TEXT( ) ).
      MESSAGE ID SY-MSGID TYPE 'S' NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 DISPLAY LIKE 'E'.
      RETURN.
  ENDTRY.

ENDFORM.

 

LV_FIRST_ROW, LV_FIRST_COL은 소스에서 엑셀 데이터 변환 시작행과 시작열을 지정하는 변수이다.

위의 템플릿 샘플 기준으로 FIRST_ROW 2, FIRST_COL 1을 예로 들면, 아래 그림에서 빨간색 박스가 있는는 곳부터 데이터 변환이 시작 된다는 것이다.

따라서 첫번째 행(코스트센터, 원가요소 1월...)은 GT_EXCEL로 데이터 변환이 되지 않고 그 아래 행에 있는 데이터(A00000, 51010602...)부터 데이터 변환이 들어갈 것이다.

 

위의 로직을 수행하고 나면 GT_EXCEL에 데이터가 담겨있다. 이후 개발하려는 프로그램 상황에 맞게 수정하면 끝.

반응형