반응형
업로드 할 엑셀 파일 템플릿을 준비한다. ▼
엑셀 데이터를 담기 위한 테이블을 선언한다. 타입은 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에 데이터가 담겨있다. 이후 개발하려는 프로그램 상황에 맞게 수정하면 끝.
반응형
'ABAP' 카테고리의 다른 글
코스트센터 그룹, 원가요소 그룹 등 HIERARCHY 읽기(K_HIERARCHY_TABLES_READ) (0) | 2025.02.26 |
---|---|
월의 마지막 날 받기(RP_LAST_DAY_OF_MONTHS) (0) | 2025.02.24 |
POPUP_TO_CONFIRM 팝업 확인 창 띄우기 (0) | 2025.02.19 |
ALV GRID 새로고침(REFRESH_TABLE_DISPLAY) (0) | 2025.02.19 |
BAPI_COSTACTPLN_POSTPRIMCOST 비용계획(KP06) (0) | 2025.02.19 |