본문 바로가기

ABAP

[ABAP] Excel Download 예제

DATA : LT_FILE    TYPE FILETABLE,
       LV_RC      TYPE I,
       LV_PATH    TYPE STRING,
       LT_FCAT    TYPE TABLE OF LVC_S_FCAT,
       LS_FCAT    LIKE LINE OF LT_FCAT,
       LT_EXCEL   TYPE REF TO DATA,
       LS_EXCEL   TYPE REF TO DATA,
       LV_ANSWER.

DATA : BEGIN OF LS_FIELDNM,
         FIELD_NAME TYPE CHAR30,
       END OF LS_FIELDNM.

DATA : LT_FIELDNM LIKE TABLE OF LS_FIELDNM.

FIELD-SYBOLS : <FT_EXCEL> TYPE TABLE,
               <FS_LINE>  TYPE ANY.



_MESSAGE_POP_UP TEXT-T28 LV_ANSWER.     "해당 내용으로 다운로드 하시겠습니까?
   IF LV_ANSWER NE GC_J.
       MESSAGE S005 DISPLAY LIKE 'E'.   "동작을 취소하였습니다.
       EXIT.
   ENDIF.



*->Display 되는 Field만 구성
LOOP AT GT_FIELDCAT INTO DATA(LS_FIELDCAT).
   "신호등, 회사, 메세지는 빼고 나머지 필드로만 구성함
   IF LS_FIELDCAT-FIELDNAME <> 'FLAG'  AND
      LS_FIELDCAT-FIELDNAME <> 'BUKRS' AND
      LS_FIELDCAT-FIELDNAME <> 'MSG'.


     LS_FCAT-FIELDNAME  =  LS_FIELDCAT-FIELDNAME.
     LS_FCAT-COL_POS    =  LS_FIELDCAT-COL_POS.
     LS_FCAT_COLTEXT    =  LS_FIELDCAT-SCRTEXT_M.

     APPEND LS_FCAT TO LT_FCAT.
     CLEAR : LS_FCAT.
   ENDIF.

ENDLOOP.


SORT LT_FCAT BY COL_POS.



*->필드를 동적으로 구성
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
     EXPORTING
         IT_FIELDCATALOG               =    LT_FCAT
     IMPORTING
         EP_TABLE                      =    LT_EXCEL
     EXCEPTIONS
         GENERATE_SUBPOOL_DIR_FULL     =    1.



ASSIGN LT_EXCEL->* TO <FT_EXCEL>.                 "동적 테이블 연결
CREATE DATA LS_EXCEL LIKE LINE OF <FT_EXCEL>.     "객체 생성
ASSIGN LS_EXCEL->* TO <FS_LINE>.                  "동적 스트럭쳐 연결



*->다운받을 경로 지정
CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG
     EXPORTING
          WINDOW_TITLE         =      ''
          DEFAULT_EXTENSION    =      'XLS'
          INITIAL_DIRECTORY    =      'C:\'
     CHANGING
          FILE_TABLE           =      LT_FILE
          RC                   =      LV_RC.



*->파일 이름 읽어옴
READ TABLE LT_FILE INTO DATA(LS_FILE) INDEX 1.
IF SY_SUBRC = 0.
    LV_PATH = LS_FILE.                 "파일이 있으면 밑에서 타입을 맞춰주기 위해 다른 변수로 옮겨줌
ELSE.
    MESSAGE S005 DISPLAY LIKE 'E'.     "동작을 취소하였습니다.
    EXIT.
ENDIF.



*->엑셀 다운로드 데이터 구성
LOOP  AT GT_DATA INTO DATA(LS_DATA).
     MOVE-CORRESPONDING LS_DATA TO <FS_LINE>.
     APPEND <FS_LINE> TO <FT_EXCEL>.
ENDLOOP.



*->LT_FIELDNM으로 헤더옮김
PERFORM SET_FIELD_HEADER TABLES LT_FCAT
                                LT_FIELDNM.



FORM SET_FIELD_HEADER TABLES PT_FCAT STRUCTURE LVC_S_FCAT
                             PT_FIELDNM TYPE STANDARD TABLE.



LOOP AT PT_FCAT INTO DATA(LS_FCAT).

     PT_FIELDNM = LS_FCAT-COLTEXT.
     APPEND PT_FIELDNM.
     CLEAR PT_FIELDNM.

ENDLOOP.

ENDFORM.



CALL METHOD  CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
     EXPORTING
          FILENAME                 =      LV_PATH      "파일 이름
          FILETYPE                 =      'ASC'        "DBF로 했을 경우 헤더가 10자리로 제한 됨
          WRITE_FIELD_SEPARATOR    =      GC_X
          FIELDNAMES               =      LT_FIELDNM   "구성한 헤드
     CHANGING
          DATA_TAB                 =      <FT_EXCEL>   "구성한 데이터
     EXCEPTIONS
          UNKNOWN_ERROR            =      1.
반응형