diff --git a/src/zcl_common_class.clas.abap b/src/zcl_common_class.clas.abap index 1352a90..a593b73 100644 --- a/src/zcl_common_class.clas.abap +++ b/src/zcl_common_class.clas.abap @@ -20,6 +20,158 @@ ENDCLASS. CLASS ZCL_COMMON_CLASS IMPLEMENTATION. - method UPLOAD_EXCEL_TO_ITAB. - endmethod. + METHOD upload_excel_to_itab. + DATA: lt_bin TYPE solix_tab, + lv_xstring TYPE xstring, + lv_filename TYPE string, + lo_excel TYPE REF TO cl_fdt_xl_spreadsheet, + lt_worksheets TYPE if_fdt_doc_spreadsheet=>t_worksheet_names, + lv_sheet_name TYPE string, + lr_data_ref TYPE REF TO data. + + DATA: lt_row TYPE ty_row, + lv_idx TYPE i. + + FIELD-SYMBOLS: TYPE STANDARD TABLE, + TYPE any, + TYPE any. + + " 파일 선택 + DATA: lt_file_table TYPE filetable, + lv_rc TYPE i. + + CALL METHOD cl_gui_frontend_services=>file_open_dialog + EXPORTING + default_extension = 'XLSX' + file_filter = 'Excel Files (*.xlsx)|*.xlsx' + CHANGING + file_table = lt_file_table + rc = lv_rc + EXCEPTIONS + OTHERS = 1. + + IF sy-subrc <> 0 OR lv_rc = 0. + MESSAGE '파일 선택이 취소되었습니다.' TYPE 'S'. + RETURN. + ENDIF. + + READ TABLE lt_file_table INDEX 1 INTO DATA(ls_file). + IF sy-subrc <> 0. + MESSAGE '선택한 파일 정보를 읽을 수 없습니다.' TYPE 'E'. + RETURN. + ENDIF. + + lv_filename = ls_file-filename. + + " 엑셀 파일 바이너리 업로드 + CALL METHOD cl_gui_frontend_services=>gui_upload + EXPORTING + filename = lv_filename + filetype = 'BIN' + IMPORTING + filelength = DATA(lv_filelength) + CHANGING + data_tab = lt_bin + 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 + access_denied = 13 + dp_out_of_memory = 14 + disk_full = 15 + dp_timeout = 16 + not_supported_by_gui = 17 + error_no_gui = 18 + OTHERS = 19. + + IF sy-subrc <> 0. + MESSAGE '엑셀 파일 업로드 중 오류가 발생했습니다.' TYPE 'E'. + RETURN. + ENDIF. + + " 바이너리 -> XSTRING 변환 + CALL FUNCTION 'SCMS_BINARY_TO_XSTRING' + EXPORTING + input_length = lv_filelength + IMPORTING + buffer = lv_xstring + TABLES + binary_tab = lt_bin + EXCEPTIONS + failed = 1 + OTHERS = 2. + + IF sy-subrc <> 0. + MESSAGE '엑셀 파일 변환 중 오류가 발생했습니다.' TYPE 'E'. + RETURN. + ENDIF. + + "---------------------------------------------------------------" + " 4. XLSX 파싱 및 첫 번째 시트 읽기 + "---------------------------------------------------------------" + TRY. + CREATE OBJECT lo_excel + EXPORTING + document_name = lv_filename + xdocument = lv_xstring. + + IF lo_excel IS INITIAL. + MESSAGE '엑셀 객체 생성에 실패했습니다.' TYPE 'E'. + EXIT. + ENDIF. + + lo_excel->if_fdt_doc_spreadsheet~get_worksheet_names( + IMPORTING + worksheet_names = lt_worksheets ). + + READ TABLE lt_worksheets INTO lv_sheet_name INDEX 1. + IF sy-subrc <> 0. + MESSAGE '워크시트를 찾을 수 없습니다.' TYPE 'E'. + EXIT. + ENDIF. + + lr_data_ref = lo_excel->if_fdt_doc_spreadsheet~get_itab_from_worksheet( + lv_sheet_name ). + + rr_data = lr_data_ref. + +* ASSIGN lr_data_ref->* TO . +* IF IS NOT ASSIGNED. +* MESSAGE '시트 데이터를 읽을 수 없습니다.' TYPE 'E'. +* EXIT. +* ENDIF. + + CATCH cx_root. + MESSAGE '엑셀 파일 해석 중 오류가 발생했습니다.' TYPE 'E'. + EXIT. + ENDTRY. + + +* LOOP AT ASSIGNING . +* CLEAR lt_row. +* +* lv_idx = 1. +* DO. +* ASSIGN COMPONENT lv_idx OF STRUCTURE TO . +* IF sy-subrc <> 0. +* EXIT. +* ENDIF. +* +* APPEND CONV string( ) TO lt_row. +* lv_idx = lv_idx + 1. +* ENDDO. +* +* APPEND lt_row TO et_data. +* ENDLOOP. + + ENDMETHOD. ENDCLASS.