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.
'ABAP > 소스코드' 카테고리의 다른 글
[Class] Excel 업로드/다운로드 통합 Class - ZCL_EXCEL_UPDOWN (1) | 2023.11.22 |
---|---|
[Report] 일괄 번역 편집기(MASS_TRANSLATE) (2) | 2023.11.15 |
[Form] Report 프로그램에 백그라운드 작업 정보 표시 (0) | 2023.09.20 |
[Report] 엑셀 데이터로 Table Insert(Modify) 프로그램 (0) | 2023.09.06 |
[Form] ALV Field catalog(필드 카탈로그) 생성 서브루틴 (0) | 2023.08.28 |
댓글