본문 바로가기
ABAP/소스코드

[Class] Internal Table 엑셀 다운로드(XLSX 형식)

by name_text 2023. 11. 15.

Internal Table 엑셀 다운로드

 

ZCL_ITAB_TO_EXCEL=>DOWNLOAD
ZCL_ITAB_TO_EXCEL=>CONV_EXCEL

 

예전에 만든 Internal Table 엑셀 다운로드 Function을 좀더 사용하기 편하도록 Class로 변경한 내용입니다.

2023.07.11 - [ABAP/소스코드] - [Function] Internal Table 엑셀 다운로드(XLSX 형식)

 

# 사용예시

ZCL_ITAB_TO_EXCEL=>DOWNLOAD : " ZCM_ITAB_FILE_DOWNLOAD_DIALOG" 펑션과 동일

 

ZCL_ITAB_TO_EXCEL=>CONV_EXCEL : "ZCM_ITAB_FILE_DOWNLOAD" 펑션과 동일

 

# 소스코드

class ZCL_ITAB_TO_EXCEL definition
  public
  final
  create public .

public section.

  class-methods CONV_EXCEL
    importing
      value(IT_ITAB) type STANDARD TABLE
      !IT_FIELDCAT type LVC_T_FCAT optional
      !IS_EXCEL type C default 'X'
    exporting
      !EV_XSTRING type XSTRING
      !EV_SIZE type I
      !EV_BINTAB type SOLIX_TAB .
  class-methods DOWNLOAD
    importing
      value(IT_ITAB) type STANDARD TABLE
      !IV_DIRECTORY type ANY optional
      !IV_FILENAME type ANY optional
      !IT_FIELDCAT type LVC_T_FCAT optional
      !IV_AUTO_OPEN type C default SPACE
    exporting
      !EV_DOWNLOAD_FILENAME type ANY
      !EV_DOWNLOAD_PATH type ANY
    exceptions
      DOWNLOAD_ERROR
      EXTENSION_ERROR .
protected section.
private section.
ENDCLASS.



CLASS ZCL_ITAB_TO_EXCEL IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_ITAB_TO_EXCEL=>CONV_EXCEL
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_ITAB                        TYPE        STANDARD TABLE
* | [--->] IT_FIELDCAT                    TYPE        LVC_T_FCAT(optional)
* | [--->] IS_EXCEL                       TYPE        C (default ='X')
* | [<---] EV_XSTRING                     TYPE        XSTRING
* | [<---] EV_SIZE                        TYPE        I
* | [<---] EV_BINTAB                      TYPE        SOLIX_TAB
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method CONV_EXCEL.
    DATA: LT_DATA         TYPE REF TO DATA,
          LT_FIELDCAT     TYPE LVC_T_FCAT.
    DATA: LO_SALV_TABLE   TYPE REF TO CL_SALV_TABLE,
          LO_RESULT_DATA  TYPE REF TO CL_SALV_EX_RESULT_DATA_TABLE.

    DATA: M_FLAVOUR       TYPE STRING.
    DATA: M_FILE_TYPE     TYPE SALV_BS_CONSTANT.

    FIELD-SYMBOLS <LFS_TAB>   TYPE ANY TABLE.

    CLEAR : EV_XSTRING, EV_SIZE.

    GET REFERENCE OF IT_ITAB INTO LT_DATA.

    IF IT_FIELDCAT[] IS INITIAL.
      ASSIGN LT_DATA->* TO <LFS_TAB>.
      TRY .
        CL_SALV_TABLE=>FACTORY(
          EXPORTING
            LIST_DISPLAY = ABAP_FALSE
          IMPORTING
            R_SALV_TABLE = LO_SALV_TABLE
          CHANGING
            T_TABLE      = <LFS_TAB> ).
      CATCH CX_SALV_MSG.

      ENDTRY.

      IF LO_SALV_TABLE IS NOT INITIAL.
        LT_FIELDCAT = CL_SALV_CONTROLLER_METADATA=>GET_LVC_FIELDCATALOG( R_COLUMNS      = LO_SALV_TABLE->GET_COLUMNS( )
                                                                         R_AGGREGATIONS = LO_SALV_TABLE->GET_AGGREGATIONS( ) ).
      ENDIF.
    ELSE.
      LT_FIELDCAT[] = IT_FIELDCAT[].
    ENDIF.

    LO_RESULT_DATA = CL_SALV_EX_UTIL=>FACTORY_RESULT_DATA_TABLE( R_DATA         = LT_DATA
                                                                 T_FIELDCATALOG = LT_FIELDCAT ).

    IF IS_EXCEL EQ 'X'.
      M_FILE_TYPE = IF_SALV_BS_XML=>C_TYPE_XLSX.
    ELSE.
      M_FILE_TYPE = IF_SALV_BS_XML=>C_TYPE_MHTML.
    ENDIF.

    CL_SALV_BS_TT_UTIL=>IF_SALV_BS_TT_UTIL~TRANSFORM(
      EXPORTING
        XML_TYPE      = M_FILE_TYPE
        XML_VERSION   = CL_SALV_BS_A_XML_BASE=>GET_VERSION( )
        R_RESULT_DATA = LO_RESULT_DATA
        XML_FLAVOUR   = IF_SALV_BS_C_TT=>C_TT_XML_FLAVOUR_EXPORT
        GUI_TYPE      = IF_SALV_BS_XML=>C_GUI_TYPE_GUI
      IMPORTING
        XML           = EV_XSTRING ).

    IF EV_BINTAB IS REQUESTED.
      EV_SIZE = XSTRLEN( EV_XSTRING ).
      EV_BINTAB = CL_BCS_CONVERT=>XSTRING_TO_SOLIX( EV_XSTRING ).
    ENDIF.

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Static Public Method ZCL_ITAB_TO_EXCEL=>DOWNLOAD
* +-------------------------------------------------------------------------------------------------+
* | [--->] IT_ITAB                        TYPE        STANDARD TABLE
* | [--->] IV_DIRECTORY                   TYPE        ANY(optional)
* | [--->] IV_FILENAME                    TYPE        ANY(optional)
* | [--->] IT_FIELDCAT                    TYPE        LVC_T_FCAT(optional)
* | [--->] IV_AUTO_OPEN                   TYPE        C (default =SPACE)
* | [<---] EV_DOWNLOAD_FILENAME           TYPE        ANY
* | [<---] EV_DOWNLOAD_PATH               TYPE        ANY
* | [EXC!] DOWNLOAD_ERROR
* | [EXC!] EXTENSION_ERROR
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method DOWNLOAD.
    DATA: LV_EXTENSION_MASK TYPE STRING,
          LV_FILENAME       TYPE STRING.
    DATA: LT_BINTAB         TYPE SOLIX_TAB,
          LV_XSTRING        TYPE XSTRING,
          LV_STRING         TYPE STRING,
          LV_SIZE           TYPE I.
    DATA: LV_ACTION         TYPE I,                "ACTION
          LV_PATH           TYPE STRING,
          LV_FILE_PATH      TYPE STRING,
          LV_DE_FILENAME    TYPE STRING.

    CLEAR EV_DOWNLOAD_FILENAME.

    IF IV_DIRECTORY IS NOT INITIAL AND IV_FILENAME IS NOT INITIAL.
      MOVE IV_FILENAME TO LV_DE_FILENAME.
      MOVE IV_DIRECTORY TO LV_PATH.
      CONCATENATE LV_PATH LV_DE_FILENAME INTO LV_FILE_PATH.
    ELSE.
      MOVE IV_FILENAME TO LV_DE_FILENAME.

      "확장자
      CLEAR LV_EXTENSION_MASK.
      IF SY-LANGU EQ '3'.
        CONCATENATE LV_EXTENSION_MASK 'Excel 통합문서 (*.xlsx)|*.xlsx' INTO LV_EXTENSION_MASK.
*        CONCATENATE LV_EXTENSION_MASK '|Excel 97 - 2003 통합문서 (*.xls)|*.xls' INTO LV_EXTENSION_MASK.
*        CONCATENATE LV_EXTENSION_MASK '|CSV(쉼표로 분리) (*.csv)|*.csv' INTO LV_EXTENSION_MASK.
*        CONCATENATE LV_EXTENSION_MASK '|텍스트 파일 (*.txt)|*.txt' INTO LV_EXTENSION_MASK.
*        CONCATENATE LV_EXTENSION_MASK '|모든 파일 (*)|*' INTO LV_EXTENSION_MASK.
      ELSE.
        CONCATENATE LV_EXTENSION_MASK 'Excel Workbook (*.xlsx)|*.xlsx' INTO LV_EXTENSION_MASK.
*        CONCATENATE LV_EXTENSION_MASK '|Excel 97 - 2003 Workbook (*.xls)|*.xls' INTO LV_EXTENSION_MASK.
*        CONCATENATE LV_EXTENSION_MASK '|CSV(Comma Separated) (*.csv)|*.csv' INTO LV_EXTENSION_MASK.
*        CONCATENATE LV_EXTENSION_MASK '|Text file (*.txt)|*.txt' INTO LV_EXTENSION_MASK.
*        CONCATENATE LV_EXTENSION_MASK '|All files (*)|*' INTO LV_EXTENSION_MASK.
      ENDIF.

      CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
        EXPORTING
*         WINDOW_TITLE              =
*         DEFAULT_EXTENSION         =
          DEFAULT_FILE_NAME         = LV_DE_FILENAME
*         WITH_ENCODING             =
          FILE_FILTER               = LV_EXTENSION_MASK "CL_GUI_FRONTEND_SERVICES=>FILETYPE_EXCEL
          INITIAL_DIRECTORY         = CONV #( IV_DIRECTORY )
*         PROMPT_ON_OVERWRITE       = 'X'
        CHANGING
          FILENAME                  = LV_FILENAME
          PATH                      = LV_PATH
          FULLPATH                  = LV_FILE_PATH
          USER_ACTION               = LV_ACTION
*         FILE_ENCODING             =
        EXCEPTIONS
          CNTL_ERROR                = 1
          ERROR_NO_GUI              = 2
          NOT_SUPPORTED_BY_GUI      = 3
          INVALID_DEFAULT_FILE_NAME = 4
          others                    = 5.
      IF SY-SUBRC <> 0 OR LV_ACTION = CL_GUI_FRONTEND_SERVICES=>ACTION_CANCEL.
        EXIT.
      ENDIF.
    ENDIF.

    CONV_EXCEL( EXPORTING IT_ITAB     = IT_ITAB
                          IT_FIELDCAT = IT_FIELDCAT
               IMPORTING  EV_XSTRING  = LV_XSTRING
                          EV_SIZE     = LV_SIZE
                          EV_BINTAB   = LT_BINTAB ).

    "다운로드
    CALL METHOD CL_GUI_FRONTEND_SERVICES=>GUI_DOWNLOAD
      EXPORTING
        BIN_FILESIZE            = LV_SIZE
        FILENAME                = LV_FILE_PATH
        FILETYPE                = 'BIN'
      CHANGING
        DATA_TAB                = LT_BINTAB
      EXCEPTIONS
        FILE_WRITE_ERROR        = 1
        NO_BATCH                = 2
        GUI_REFUSE_FILETRANSFER = 3
        INVALID_TYPE            = 4
        NO_AUTHORITY            = 5
        UNKNOWN_ERROR           = 6
        HEADER_NOT_ALLOWED      = 7
        SEPARATOR_NOT_ALLOWED   = 8
        FILESIZE_NOT_ALLOWED    = 9
        HEADER_TOO_LONG         = 10
        DP_ERROR_CREATE         = 11
        DP_ERROR_SEND           = 12
        DP_ERROR_WRITE          = 13
        UNKNOWN_DP_ERROR        = 14
        ACCESS_DENIED           = 15
        DP_OUT_OF_MEMORY        = 16
        DISK_FULL               = 17
        DP_TIMEOUT              = 18
        FILE_NOT_FOUND          = 19
        DATAPROVIDER_EXCEPTION  = 20
        CONTROL_FLUSH_ERROR     = 21
        OTHERS                  = 22.
    IF SY-SUBRC NE 0.
      MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
            WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 RAISING DOWNLOAD_ERROR.
      EXIT.
    ENDIF.

    IF IV_AUTO_OPEN EQ 'X'.
      CALL METHOD CL_GUI_FRONTEND_SERVICES=>EXECUTE
        EXPORTING
          DOCUMENT               = LV_FILE_PATH
        EXCEPTIONS
          CNTL_ERROR             = 1
          ERROR_NO_GUI           = 2
          BAD_PARAMETER          = 3
          FILE_NOT_FOUND         = 4
          PATH_NOT_FOUND         = 5
          FILE_EXTENSION_UNKNOWN = 6
          ERROR_EXECUTE_FAILED   = 7
          SYNCHRONOUS_FAILED     = 8
          NOT_SUPPORTED_BY_GUI   = 9
          others                 = 10.
      IF SY-SUBRC <> 0.
        MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
              WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4 RAISING DOWNLOAD_ERROR.
      ENDIF.
    ENDIF.

    EV_DOWNLOAD_FILENAME = LV_FILENAME.
    EV_DOWNLOAD_PATH     = LV_PATH.
  endmethod.
ENDCLASS.

댓글