commit (2026.08.18 17:05)

This commit is contained in:
2026-08-18 08:05:30 +00:00
parent ee785895b1
commit b415fbaefd
+154 -2
View File
@@ -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: <lt_sheet> TYPE STANDARD TABLE,
<ls_sheet> TYPE any,
<lv_cell> 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 <lt_sheet>.
* IF <lt_sheet> IS NOT ASSIGNED.
* MESSAGE '시트 데이터를 읽을 수 없습니다.' TYPE 'E'.
* EXIT.
* ENDIF.
CATCH cx_root.
MESSAGE '엑셀 파일 해석 중 오류가 발생했습니다.' TYPE 'E'.
EXIT.
ENDTRY.
* LOOP AT <lt_sheet> ASSIGNING <ls_sheet>.
* CLEAR lt_row.
*
* lv_idx = 1.
* DO.
* ASSIGN COMPONENT lv_idx OF STRUCTURE <ls_sheet> TO <lv_cell>.
* IF sy-subrc <> 0.
* EXIT.
* ENDIF.
*
* APPEND CONV string( <lv_cell> ) TO lt_row.
* lv_idx = lv_idx + 1.
* ENDDO.
*
* APPEND lt_row TO et_data.
* ENDLOOP.
ENDMETHOD.
ENDCLASS.