본문 바로가기
ABAP

엑셀 업로드

by clode 2023. 2. 16.
728x90
반응형

실습

엑셀파일을 인터널테이블에 담아 ALV로 출력해주는 실습을 진행한다.


[프로그램 로직]

[데이터 선언부]

REPORT zs1d11_026.

TYPES truxs_t_text_data(4096) TYPE c OCCURS 0.

TYPES:    BEGIN OF itab,
          seqnr TYPE zs1d11t_01-seqnr,
          team TYPE zs1d11t_01-team,
          note TYPE zs1d11t_01-note,
          END OF itab.

DATA:     gv_rc      TYPE i,
          gv_file    TYPE localfile,
          gt_file    TYPE filetable,
          gv_data    TYPE truxs_t_text_data,
          g_salv     TYPE REF TO cl_salv_table, "salv
          g_frontend TYPE REF TO cl_gui_frontend_services. "업로드용 파일

DATA :     gs_itab  TYPE itab,
           gs_tab   TYPE zs1d11t_01,
           gt_itab  TYPE TABLE OF itab,
           gs_excel TYPE alsmex_tabline, "엑셀 업로드 담을 wa
           gt_tab   TYPE TABLE OF zs1d11t_01,
           gt_excel TYPE TABLE OF alsmex_tabline. "엑셀 업로드 데이터 담을 int

CONSTANTS : c_filter TYPE string VALUE
            'EXCEL FILES (*.XLSX)|*.XLSX|EXCEL FILES (*.XLS)|*.XLS|'.

FIELD-SYMBOLS <fs>.

[SELECTION SCREEN]
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-000.
PARAMETERS : p_file TYPE localfile.
SELECTION-SCREEN END OF BLOCK b1.

SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-001.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS : p_alsm RADIOBUTTON GROUP rd1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT 4(30) TEXT-c01. "위치(길이)

PARAMETERS : p_text RADIOBUTTON GROUP rd1.
SELECTION-SCREEN COMMENT 38(30) TEXT-c02.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b2.

[INITIALIZATION]
 " OBJECT 생성
  CREATE OBJECT g_frontend.

[AT SELECTION-SCREEN]
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
  PERFORM get_filepath.   " 파일 경로 조회

[START-OF-SELECTION]
CHECK p_file IS NOT INITIAL.
  " ALSM_EXCEL_TO_INTERNAL_TABLE 펑션 실행 예제
  IF p_alsm = 'X'.
    PERFORM call_func1.

    " TEXT_CONVERT_XLS_TO_SAP 펑션 실행 예제
  ELSE.
    PERFORM call_func2.
  ENDIF.

[END-OF-SELECTION]

  CHECK gt_itab[] IS NOT INITIAL.

  PERFORM create_salv.

[FORM문]
*파일 경로 가져오는 로직

FORM get_filepath .

  CLEAR : gv_rc, gt_file[].
  CALL METHOD g_frontend->file_open_dialog
    EXPORTING
      file_filter       = c_filter
      initial_directory = 'C:'
      default_filename  = space
    CHANGING
      file_table        = gt_file
      rc                = gv_rc
    EXCEPTIONS
      OTHERS            = 1.

  CLEAR p_file.
  READ TABLE gt_file INTO p_file INDEX 1.
ENDFORM.                    " GET_FILEPATH
* ALSM_EXCEL_TO_INTERNAL_TABLE 펑션 실행 예제

FORM call_func1 .

*  P_FILE에 선택한 엑셀파일 이름, 경로값이 들어가고 INITIAL이 아니기때문에 구문수행하고
*  P_ALSM에 X가 들어간다 CALL_FUN1으로 들어간다
*  펑션 수행하고 나면 GT_EXCEL에 3(열)*10(행), 30줄이 들어가게 된다

" 엑셀 업로드
  CLEAR gt_excel[].
  CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
    EXPORTING
      filename                = p_file
      i_begin_col             = 1
      i_begin_row             = 2
      i_end_col               = 3
      i_end_row               = 10000 "만건까지 가능
    TABLES
      intern                  = gt_excel[]
    EXCEPTIONS
      inconsistent_parameters = 1
      upload_ole              = 2
      OTHERS                  = 3.

*  GT_EXCEL에 값이 있으니까 NOT INITIAL구문을 타고
*  GT_ITAB는 COL의 첫번째줄

  " 업로드된 엑셀을 LINE/COL 별로 MOVE
  IF gt_excel[] IS NOT INITIAL.
    CLEAR gt_itab[].
    LOOP AT gt_excel INTO gs_excel.
      UNASSIGN <fs>.
      ASSIGN COMPONENT gs_excel-col OF STRUCTURE gs_itab TO <fs>.

      IF <fs> IS ASSIGNED.
        <fs> = gs_excel-value.
      ENDIF.

      AT END OF row. "마지막 줄일때
        APPEND gs_itab TO gt_itab.
        CLEAR gs_itab.
      ENDAT.
    ENDLOOP.
  ENDIF.
ENDFORM.                    " CALL_FUNC1
FORM call_func2 .

  CLEAR gt_itab[].
  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
    EXPORTING
      i_line_header        = 'X'         " 첫라인 삭제
      i_tab_raw_data       = gv_data
      i_filename           = p_file
    TABLES
      i_tab_converted_data = gt_itab[]
    EXCEPTIONS
      conversion_failed    = 1
      OTHERS               = 2.


ENDFORM.                    " CALL_FUNC2
FORM create_salv . "SALV 생성 및 실행


  DATA : lr_dspset TYPE REF TO                     cl_salv_display_settings.
  DATA: LR_COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE.

  " SALV 생성
  cl_salv_table=>factory( IMPORTING  r_salv_table = g_salv
                           CHANGING  t_table      = gt_itab ).


  " zebra stripes, 줄무늬
  lr_dspset = g_salv->get_display_settings( ).
  lr_dspset->set_striped_pattern( abap_true ).

  "너비최적화
  LR_COLUMNS = G_SALV->GET_COLUMNS(  ).
  LR_COLUMNS->SET_OPTIMIZE( ABAP_TRUE ).


  " SALV 실행
  g_salv->display( ).

ENDFORM.                    " CREATE_SALV

[실행 화면]

서치헬프를 누르면 내컴퓨터의 파일들이 나온다. 엑셀파일을 선택하고 실행해주면

엑셀파일의 데이터가 인터널테이블에 들어가고 인터널테이블을 ALV로 뿌려준다.

728x90
반응형

'ABAP' 카테고리의 다른 글

ALV  (0) 2023.02.16
엑셀 업로드 + BDC  (0) 2023.02.16
BDC 프로그램  (0) 2023.02.16
Field-symbols 2  (0) 2023.02.16
Field-symbols 1  (0) 2023.02.16

댓글