ABAP EXCEL 프로그램2
ABAP에서 Excel 파일 다운로드 및 처리에 관한 상세 정리
1. Excel 다운로드를 위한 주요 개념
•
OLE(Object Linking and Embedding): ABAP에서 Excel 매크로의 기능을 활용하기 위해 사용. 이를 통해 Excel 애플리케이션과 상호작용 가능.
•
객체 생성: CREATE OBJECT를 사용해 Excel 객체를 생성하고, Excel 애플리케이션의 기능을 인수인계받아 사용할 수 있음.
•
Excel 애플리케이션, Workbook, Worksheet: Excel 내부 구조에 따라 작업을 분리하여 처리.
2. 주요 로직 및 설명
a. 경로 설정 (Directory 선택)
FORM set_directory USING p_fname.
CLEAR gv_file.
CREATE OBJECT objfile.
objfile->get_temp_directory( CHANGING temp_dir = gv_initial_dir
EXCEPTIONS cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3 ).
objfile->directory_browse( EXPORTING initial_folder = gv_initial_dir
CHANGING selected_folder = gv_directory
EXCEPTIONS cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3 ).
IF sy-subrc = 0.
gv_file = gv_directory && '\' && p_fname && '.xlsx'.
ELSE.
MESSAGE '파일경로에러' TYPE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
ABAP
복사
1.
get_temp_directory: 사용자 시스템에서 기본 임시 폴더 경로를 가져옴.
2.
directory_browse: 사용자가 다운로드할 폴더를 선택할 수 있도록 경로 탐색창 제공.
3.
gv_file: 최종적으로 생성될 Excel 파일의 전체 경로와 이름을 지정.
b. Excel 다운로드 (OLE 객체 사용)
FORM download_excel_smpl.
CREATE OBJECT go_application 'Excel.Application'.
SET PROPERTY OF go_application 'Visible' = 1.
CALL METHOD OF go_application 'Workbooks' = go_wbook.
CALL METHOD OF go_wbook 'Add'.
CALL METHOD OF go_application 'Worksheets' = go_sheet EXPORTING #1 = 1.
CALL METHOD OF go_sheet 'Activate'.
SET PROPERTY OF go_sheet 'Name' = 'ZSCARR'.
GET PROPERTY OF go_application 'ActiveWorkbook' = go_wbook.
* 데이터 입력
PERFORM fill_cell USING go_application 1 1 'MANDT'.
PERFORM fill_cell USING go_application 1 2 'CARRID'.
PERFORM fill_cell USING go_application 1 3 'CARRNAME'.
* 파일 저장
CALL METHOD OF go_wbook 'SaveAs' EXPORTING #1 = gv_file.
IF sy-subrc = 0.
MESSAGE '엑셀정상다운' TYPE 'S'.
ELSE.
MESSAGE '엑셀다운에러' TYPE 'S'.
ENDIF.
ENDFORM.
ABAP
복사
1.
CREATE OBJECT go_application: Excel 애플리케이션 객체 생성.
2.
Workbooks와 Worksheets: Excel 파일(Workbook)과 시트(Worksheet)를 생성하고 관리.
3.
fill_cell: Excel 셀에 데이터를 입력하기 위한 PERFORM 구문 사용.
4.
SaveAs: Excel 파일을 지정된 경로에 저장.
c. 셀 데이터 입력 (PERFORM 구문 활용)
FORM fill_cell USING pv_application pv_row pv_col pv_value.
DATA: lv_ecell TYPE ole2_object.
CALL METHOD OF pv_application 'Cells' = lv_ecell
EXPORTING
#1 = pv_row
#2 = pv_col.
SET PROPERTY OF lv_ecell 'Value' = pv_value.
ENDFORM.
ABAP
복사
1.
셀 데이터 설정: 특정 행(pv_row), 열(pv_col), 값(pv_value)을 지정하여 Excel 셀에 데이터 입력.
2.
Cells: Excel의 셀 참조 객체를 생성하고, 값을 설정.
d. 셀 스타일 및 정렬 설정
CALL METHOD OF go_application 'Columns' = lo_columns.
CALL METHOD OF lo_columns 'AutoFit'. " 열 자동 정렬
ABAP
복사
•
열 너비 조정: AutoFit 메소드를 통해 데이터에 맞춰 열 크기를 자동 조정.
•
정렬 및 병합: 범위를 지정하고 가운데 정렬 및 병합 설정 가능.
CALL METHOD OF RANGE 'Merge'. " 범위 병합
SET PROPERTY OF RANGE 'HorizontalAlignment' = c_center. " 가운데 정렬
ABAP
복사
e. 셀 색상 설정
DATA: lo_interior TYPE ole2_object.
CALL METHOD OF lv_ecell 'Interior' = lo_interior.
SET PROPERTY OF lo_interior 'Color' = 65535. " 노란색
ABAP
복사
1.
Interior: 셀 배경색 설정을 위한 속성.
2.
Color: 색상 코드로 배경색 지정(예: 65535 = 노란색).
f. 테두리 설정
CALL METHOD OF RANGE 'Borders' = borders EXPORTING #1 = 7.
SET PROPERTY OF borders 'LineStyle' = 1. " 테두리 스타일
ABAP
복사
•
테두리 설정: Borders 속성을 통해 셀의 테두리 스타일 및 종류 지정.
3. 최종 구성 예시
엑셀 매크로를 통해 특정 데이터를 Excel 파일로 다운로드하고, 셀 스타일 및 정렬, 색상, 테두리 등을 설정할 수 있는 코드 조합입니다.
4. 주요 상수
상수명 | 설명 | 값 |
c_center | 가운데 정렬 | -4108 |
c_left | 왼쪽 정렬 | -4131 |
c_right | 오른쪽 정렬 | -4152 |
색상 코드 | 노란색 | 65535 |
테두리 코드 | 기본 스타일 | 1 |
5. 참고
•
OLE2_OBJECT: Excel 매크로의 기능을 부여하기 위해 사용.
•
Excel 색상 코드: 색상 코드는 10진수 값으로 지정되며, 특정 코드에 따라 색상이 달라짐.
•
정렬 및 병합: 범위와 속성을 사용하여 데이터 표현을 깔끔하게 구성 가능.
이와 같은 방식으로 ABAP 코드에서 Excel 파일을 손쉽게 다운로드하고 스타일링할 수 있습니다.
ACT_FUNTION_KEY 더블클릭
EXCEL_DOWN_SMPL 더블클릭
디버깅 걸고
FORM excel_down_smpl .
* 다운로드 양식 선택
LS_KEY-OBJID = 'ZTEST14_EXCEL01'. " 다운로드 받을 엑셀 파일의 이름 설정 (40자 제한)
LS_KEY-RELID = 'MI'. " RELID는 구분 용도로 사용 (필수는 아니며 시스템마다 다를 수 있음. 없어도됨)
* 파일 경로 조회
PERFORM SET_DIRECTORY USING LS_KEY-OBJID. " 사용자로부터 파일을 저장할 경로를 선택 받음
* 엑셀 다운
PERFORM DOWNLOAD_EXCEL_SMPL USING LS_KEY-OBJID. " 엑셀 파일 생성 및 다운로드를 수행(매크로 실행해서 다운)
IF SY-SUBRC = 0. " SY-SUBRC가 0일 경우는 엑셀 다운로드 성공
MESSAGE '엑셀정상다운' TYPE 'S'. " 성공 메시지를 출력
ELSE. " SY-SUBRC가 0이 아닐 경우는 엑셀 다운로드 실패
MESSAGE '엑셀다운에러' TYPE 'S'. " 에러 메시지를 출력
ENDIF.
ENDFORM.
ABAP
복사
PERFORM USING 변수
•
FORM구문에 이 변수를 다시 받아서 사용하겠다
◦
로컬변수로 선언한걸 가져다가 FORM 구문안에서도 쓰고 싶다
◦
여러개의 변수를 직접 받아다가 재사용하고 싶다 (반복적으로)
LS_KEY 들어가서 보고 싱글스탭 한번해주고 OBJID가 들어온다
LS_KEY-OBJID가 새로운 변수(p_ls_key_objid - 로컬변수)로 해서 받아온다
FORM set_directory USING p_ls_key_objid.
" ls_key-objid 값을 로컬 변수로 받아오는 서브루틴이다.
CLEAR GV_FILE.
" 파일 경로를 저장할 전역 변수 GV_FILE을 초기화한다.
CREATE OBJECT OBJFILE.
" CL_GUI_FRONTEND_SERVICES 클래스의 객체 OBJFILE을 생성한다.
" 처음 생성된 OBJFILE은 아무것도 모르는 신입사원과 같다. 즉, 빈 깡통 상태이다.
" CL_GUI_FRONTEND_SERVICES는 직장 상사로, 다양한 GUI 관련 작업을 수행할 수 있는 능력을 가지고 있다.
" 직장 상사가 본인의 일을 신입사원인 OBJFILE에게 인수인계한다.
" OBJFILE은 이제 직장 상사의 모든 기능을 대신 수행할 수 있는 상태가 된다.
IF GV_FILE IS NOT INITIAL.
" 만약 GV_FILE에 값이 이미 있다면,
GV_INITIAL_DIR = GV_FILE.
" 초기 디렉토리 경로를 GV_FILE의 값으로 설정한다.
ELSE.
" GV_FILE이 비어 있다면 (처음 실행 시),
OBJFILE->GET_TEMP_DIRECTORY( CHANGING TEMP_DIR = GV_INITIAL_DIR
EXCEPTIONS CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3 ).
" OBJFILE(신입사원)에게 임시 디렉토리를 가져오도록 요청한다.
" 이 과정에서 발생할 수 있는 예외 사항들을 처리해야 한다.
ENDIF.
OBJFILE->DIRECTORY_BROWSE( EXPORTING INITIAL_FOLDER = GV_INITIAL_DIR
CHANGING SELECTED_FOLDER = GV_DIRECTORY
EXCEPTIONS CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3 ).
" OBJFILE(신입사원)에게 사용자가 디렉토리를 선택할 수 있도록 다이얼로그 창을 열게 한다.
" 사용자가 선택한 디렉토리는 GV_DIRECTORY 변수에 저장된다.
IF SY-SUBRC = 0.
" SY-SUBRC가 0이라면 (성공적으로 디렉토리가 선택되었다면),
GV_FILE = GV_DIRECTORY && '\' && LS_KEY-OBJID && '.xlsx'.
" 최종 파일 경로를 생성하고 GV_FILE 변수에 저장한다.
ELSE.
" 디렉토리 선택에 실패한 경우,
MESSAGE '파일경로에러' TYPE 'E'.
" 오류 메시지를 출력한다.
LEAVE LIST-PROCESSING.
" 리스트 프로세싱을 종료한다.
ENDIF.
ENDFORM.
ABAP
복사
왜 굳이 이런 방식을 사용하는가?
1.
TOP 영역에서 사용하는 클래스를 명시적으로 볼 수 있다.
•
프로그램의 TOP 영역에서 DATA: objfile TYPE REF TO cl_gui_frontend_services.
◦
선언을 통해 어떤 클래스(CL_GUI_FRONTEND_SERVICES)를 사용하는지 명확히 보여준다.
•
이는 코드를 처음 접하는 개발자가 "어떤 클래스가 사용되고 있는지"를 한눈에 파악할 수 있게 해준다.
2.
클래스를 직접 호출하지 않는 이유
•
클래스(CL_GUI_FRONTEND_SERVICES)를 직접 호출하면 코드가 길어지고 읽기 어려워진다.
•
매번 CL_GUI_FRONTEND_SERVICES=>METHOD_NAME 형태로 사용하는 대신, 객체를 생성하고 objfile->method_name처럼 간단히 호출 가능하다.
•
예:
CL_GUI_FRONTEND_SERVICES=>DIRECTORY_BROWSE( ... ).
ABAP
복사
objfile->directory_browse( ... ).
ABAP
복사
3.
클래스와 객체의 차이
•
클래스(CL_GUI_FRONTEND_SERVICES)
◦
설계도 역할을 하며, 다양한 기능(메서드)을 정의한다. "직장 상사"로 비유 가능.
•
객체(OBJFILE)
◦
클래스로부터 생성된 "실체"로, 직장 상사의 일을 대신 수행하는 "신입사원" 같은 존재다.
결론적으로 왜 객체를 생성하고 사용하는가?
•
TOP 영역에서 클래스 사용이 명시적으로 드러난다.
•
코드 간결성: 클래스명 전체를 매번 적는 대신, 단어 하나(OBJFILE)로 간단히 작업할 수 있다.
•
유지보수성: 객체만 변경하면 해당 객체를 사용하는 모든 코드에 적용되므로 유지보수가 용이하다.
•
역할 분리: 클래스는 설계, 객체는 실행이라는 역할을 분리하여 코드의 가독성과 확장성을 높인다.
이때 아무것도 없는 깡통이였는데 싱글스탭으로 쭉 넘기면
이렇게 들어온다.
FORM excel_down_smpl .
* 다운로드 양식 선택
* LS_KEY-OBJID = 'ZTEST14_EXCEL01'.
* LS_KEY-RELID = 'MI'.
DATA FNAME(40) TYPE C.
* 파일 경로 조회
* PERFORM SET_DIRECTORY USING LS_KEY-OBJID.
PERFORM SET_DIRECTORY USING FNAME.
* 엑셀 다운
* PERFORM DOWNLOAD_EXCEL_SMPL USING LS_KEY-OBJID.
PERFORM DOWNLOAD_EXCEL_SMPL USING FNAME.
IF SY-SUBRC = 0.
MESSAGE '엑셀정상다운' TYPE 'S'.
ELSE.
MESSAGE '엑셀다운에러' TYPE 'S'.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form SET_DIRECTORY
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> LS_KEY_OBJID
*&---------------------------------------------------------------------*
*FORM set_directory USING p_ls_key_objid.
FORM set_directory USING p_fname.
CLEAR GV_FILE.
CREATE OBJECT OBJFILE.
IF GV_FILE IS NOT INITIAL.
GV_INITIAL_DIR = GV_FILE.
ELSE.
OBJFILE->GET_TEMP_DIRECTORY( CHANGING TEMP_DIR = GV_INITIAL_DIR
EXCEPTIONS CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3 ).
ENDIF.
OBJFILE->DIRECTORY_BROWSE( EXPORTING INITIAL_FOLDER = GV_INITIAL_DIR
CHANGING SELECTED_FOLDER = GV_DIRECTORY
EXCEPTIONS CNTL_ERROR = 1
ERROR_NO_GUI = 2
NOT_SUPPORTED_BY_GUI = 3 ).
IF SY-SUBRC = 0.
* GV_FILE = GV_DIRECTORY && '\' && LS_KEY-OBJID && '.xlsx'.
GV_FILE = GV_DIRECTORY && '\' && p_fname && '.xlsx'.
ELSE.
MESSAGE '파일경로에러' TYPE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
ABAP
복사
기존의 LS_KEY-OBJID 이 부분을 FNAME로 변경해서 디버깅을 찍으면
fname은 인식이 안되는데 fP_fname은 인식되고 있다
gv_initial_dir = 'D:\'.
ABAP
복사
미리 파일경로를 잡고 돌리면은 창이 켜질때 기본으로 잡혀서 켜진다.
FORM excel_down_smpl .
* 다운로드 양식 선택
* LS_KEY-OBJID = 'ZTEST14_EXCEL01'.
* LS_KEY-RELID = 'MI'.
DATA FNAME(40) TYPE C.
FNAME = 'TABLE_SAMPLE'.
* 파일 경로 조회
* PERFORM SET_DIRECTORY USING LS_KEY-OBJID.
PERFORM SET_DIRECTORY USING FNAME.
* 엑셀 다운
* PERFORM DOWNLOAD_EXCEL_SMPL USING LS_KEY-OBJID.
PERFORM DOWNLOAD_EXCEL_SMPL.
IF SY-SUBRC = 0.
MESSAGE '엑셀정상다운' TYPE 'S'.
ELSE.
MESSAGE '엑셀다운에러' TYPE 'S'.
ENDIF.
ENDFORM.
ABAP
복사
엑셀 다운 쪽에서 원래
PERFORM DOWNLOAD_EXCEL_SMPL USING FNAME.
ABAP
복사
이였는데 USING을 굳이 쓸 필요없어서 지워줬다.
지우면서 이제 하단의 FORM 쪽의 USING을 지워주면 된다.
FORM download_excel_smpl .
" 엑셀 파일을 생성하고 데이터를 채운 뒤 저장하는 서브루틴이다.
"* OLE OBJECT 생성 및 Excel 애플리케이션 실행
CREATE OBJECT GO_APPLICATION 'Excel.Application'.
" Excel.Application OLE 객체를 생성한다.
" 생성된 객체는 Excel 프로그램을 제어할 수 있는 권한을 갖는다.
"* Excel 창 표시 여부 설정
SET PROPERTY OF GO_APPLICATION 'Visible' = 1.
" Excel 애플리케이션의 Visible 속성을 1로 설정하여 Excel 창을 화면에 표시한다.
" (0으로 설정하면 화면에 표시되지 않고 백그라운드에서 동작한다.)
"* Workbooks 객체 가져오기 및 Workbook 추가
CALL METHOD OF GO_APPLICATION 'Workbooks' = GO_WBOOK.
" 현재 Excel 애플리케이션의 Workbooks 컬렉션을 가져온다.
CALL METHOD OF GO_WBOOK 'Add'.
" 새 Workbook(엑셀 파일)을 추가한다.
"* Worksheets 객체 가져오기 및 첫 번째 Sheet 활성화
CALL METHOD OF GO_APPLICATION 'Worksheets' = GO_SHEET
EXPORTING
#1 = 1.
" 첫 번째 Worksheet를 선택하여 활성화한다.
CALL METHOD OF GO_SHEET 'Activate'.
" 선택된 Worksheet를 활성화 상태로 만든다.
SET PROPERTY OF GO_SHEET 'Name' = 'ZSCARR'.
" 활성화된 Worksheet의 이름을 'ZSCARR'로 변경한다.
GET PROPERTY OF GO_APPLICATION 'ActiveWorkbook' = GO_WBOOK.
" 현재 활성화된 Workbook 객체를 가져온다.
"* 데이터 입력
PERFORM FILL_CELL USING GO_APPLICATION
01: 01 'MANDT',
02 'CARRID',
03 'CARRNAME',
04 'CURRCODE',
05 'URL'.
" FILL_CELL 서브루틴을 호출하여 데이터를 엑셀에 입력한다.
" GO_APPLICATION 객체를 통해 각 셀에 데이터를 채운다.
"* 파일 경로 설정
" CONCATENATE GV_DIRECTORY '\' P_LS_KEY_OBJID '.xlsx' INTO GV_PATH.
" GV_DIRECTORY와 P_LS_KEY_OBJID를 이용해 최종 저장 경로 GV_PATH를 생성한다.
" 예: C:\Users\Example\example.xlsx
"* 파일 저장
CALL METHOD OF GO_WBOOK 'SaveAs' EXPORTING #1 = GV_PATH.
" Workbook을 지정된 경로에 '.xlsx' 형식으로 저장한다.
" EXPORTING =>> 위치 지정한다.
" #1 = pv_row. 몇번째 행
" #2 = pv_col. 몇번째 열
IF SY-SUBRC = 0.
" 파일 저장에 성공한 경우,
MESSAGE '엑셀정상다운' TYPE 'S'.
" 성공 메시지를 출력한다.
ELSE.
" 파일 저장에 실패한 경우,
MESSAGE '엑셀다운에러' TYPE 'S'.
" 실패 메시지를 출력한다.
ENDIF.
ENDFORM.
FORM FILL_CELL USING PV_APPLICATION
PV_ROW
PV_COL
PV_VALUE.
" Excel의 특정 셀에 값을 입력하는 서브루틴이다.
" PARAMETERS:
" PV_APPLICATION - Excel 애플리케이션 객체.
" PV_ROW - 값을 입력할 셀의 행 번호.
" PV_COL - 값을 입력할 셀의 열 번호.
" PV_VALUE - 해당 셀에 입력할 값.
DATA: LV_ECELL TYPE OLE2_OBJECT.
" OLE2_OBJECT 타입의 LV_ECELL 변수는 특정 Excel 셀 객체를 참조한다.
"* 특정 셀 객체 가져오기
CALL METHOD OF PV_APPLICATION 'Cells' = LV_ECELL
EXPORTING
#1 = PV_ROW
#2 = PV_COL.
" Excel 애플리케이션에서 지정된 행(PV_ROW)과 열(PV_COL)에 해당하는 셀 객체를 가져온다.
" 가져온 셀 객체는 LV_ECELL 변수에 저장된다.
"* 셀에 값 설정
SET PROPERTY OF LV_ECELL 'Value' = PV_VALUE.
" LV_ECELL 객체의 Value 속성을 사용하여 지정된 값을 셀에 입력한다.
ENDFORM.
ABAP
복사
아무것도 없다가 싱글스탭 이후에 CREATE OBJECT 하는 순간 값들이 들어오는걸 볼 수 있다
TOP쪽의 OLE2_OBJECT를 더블클릭해서 보면
상수를 넣어서 셋팅한걸 볼 수 있다.
이런식으로매크로 돌면서 행에 맞춰서 값이 들어가는걸 볼 수 있음.
SET PROPERTY OF GO_APPLICATION 'SheetsInNewWorkbook' = 2.
ABAP
복사
이 문장 하나를 추가해준다
SheetsInNewWorkbook 속성
•
이 속성은 새로 생성되는 Workbook(엑셀 파일)에 기본적으로 포함될 Sheet(워크시트)의 개수를 설정하는 데 사용된다.
•
기본적으로 Excel에서 새로 생성하는 Workbook에는 3개의 Sheet가 포함. 그래서 2개의 Sheet로 변경할 수 있다.
* 데이터 입력
PERFORM FILL_CELL USING GO_APPLICATION 01: 01 'MANDT',
02 'CARRID',
03 'CARRNAME',
04 'CURRCODE',
05 'URL'.
ABAP
복사
밑에 하단의 소스를 넣어준다
* 주요 기능: 엑셀의 열 너비 설정, 셀 범위와 테두리 스타일 지정, 수평 정렬, 새로운 워크시트 생성 및 이름 설정.
*DATA: lo_columns TYPE ole2_object.
*CALL METHOD OF go_application 'Columns' = lo_columns.
*CALL METHOD OF lo_columns 'Autofit'.
" 위 코드는 주석 처리되었지만, 엑셀 열의 자동 너비 조정을 위해 사용 가능하다.
* 각 열의 너비를 수동으로 설정
PERFORM column_width USING 1 15.
PERFORM column_width USING 2 15.
PERFORM column_width USING 3 15.
PERFORM column_width USING 4 15.
PERFORM column_width USING 5 15.
" 열(column)의 너비를 15로 설정한다.
" PERFORM column_width는 각 열의 너비를 설정하는 서브루틴을 호출한다.
* 셀 범위 설정과 관련된 OLE 객체 선언
DATA : BORDERS TYPE OLE2_OBJECT.
DATA : RANGE TYPE OLE2_OBJECT.
DATA : CELL1 TYPE OLE2_OBJECT.
DATA : CELL2 TYPE OLE2_OBJECT.
* 특정 셀의 위치를 지정 (CELL1은 첫 번째 셀)
CALL METHOD OF GO_APPLICATION 'CELLS' = CELL1
EXPORTING
#1 = 1 " 행 번호 (Row): 1
#2 = 1. " 열 번호 (Column): 1
" CELL1은 (1, 1) 위치의 셀을 참조한다.
* 또 다른 셀의 위치를 지정 (CELL2는 두 번째 셀)
CALL METHOD OF GO_APPLICATION 'Cells' = CELL2
EXPORTING
#1 = 2 " 행 번호 (Row): 2
#2 = 5. " 열 번호 (Column): 5
" CELL2는 (2, 5) 위치의 셀을 참조한다.
* CELL1과 CELL2를 기준으로 범위(RANGE) 객체 생성
CALL METHOD OF GO_APPLICATION 'Range' = RANGE
EXPORTING
#1 = CELL1
#2 = CELL2.
" RANGE는 CELL1(1,1)부터 CELL2(2,5)까지의 범위를 포함하는 객체이다.
* 테두리 스타일 설정 (RANGE에 테두리를 추가)
CALL METHOD OF RANGE 'borders' = borders
EXPORTING #1 = 7.
SET PROPERTY OF borders 'Linestyle' = 1.
" 테두리(LineStyle)를 스타일 1(실선)로 설정. #1 = 7은 테두리 종류를 나타낸다.
* 위와 동일한 작업을 다른 테두리(위, 아래, 좌, 우 등)에 반복 적용
CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 8. SET PROPERTY OF borders 'Linestyle' = 1.
CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 9. SET PROPERTY OF borders 'Linestyle' = 1.
CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 10. SET PROPERTY OF borders 'Linestyle' = 1.
CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 11. SET PROPERTY OF borders 'Linestyle' = 1.
CALL METHOD OF RANGE 'borders' = borders EXPORTING #1 = 12. SET PROPERTY OF borders 'Linestyle' = 1.
" #1 값은 각 방향별 테두리를 의미. 예: 7(전체), 8(위쪽), 9(아래쪽), 10(왼쪽), 11(오른쪽), 12(대각선).
* 수평 정렬 설정
CONSTANTS:
c_center TYPE i VALUE -4108, " 중앙 정렬
c_left TYPE i VALUE -4131, " 왼쪽 정렬
c_right TYPE i VALUE -4152. " 오른쪽 정렬
CALL METHOD OF RANGE 'select'.
" RANGE 객체를 선택.
SET PROPERTY OF RANGE 'HorizontalAlignment' = c_center.
" 수평 정렬을 중앙으로 설정(-4108 값).
* 새로운 워크시트 생성 및 활성화
CALL METHOD OF GO_APPLICATION 'Worksheets' = GO_SHEET
EXPORTING
#1 = 2.
" 두 번째 워크시트를 선택.
CALL METHOD OF GO_SHEET 'Activate'.
" 선택한 워크시트를 활성화.
SET PROPERTY OF GO_SHEET 'Name' = 'ZSCARR2'.
" 활성화된 워크시트의 이름을 'ZSCARR2'로 설정.
GET PROPERTY OF GO_APPLICATION 'ActiveWorkbook' = GO_WBOOK.
" 현재 활성화된 Workbook 객체를 가져온다.
ABAP
복사
PERFORM 구문이 없어서 더블클릭해서 생성해주자
*&---------------------------------------------------------------------*
*& Form COLUMN_WIDTH
*&---------------------------------------------------------------------*
*& Excel의 특정 열(Column)의 너비를 설정하는 서브루틴이다.
*&---------------------------------------------------------------------*
*& PARAMETERS:
*& P_COLUMN - 열 번호 (조정하려는 열의 번호).
*& P_WIDTH - 열 너비 (설정하려는 열의 폭).
*&---------------------------------------------------------------------*
FORM column_width USING p_column TYPE i
p_width TYPE i.
DATA:
lo_selection TYPE ole2_object, " 현재 선택된 Excel 영역을 참조하는 OLE 객체
lo_column TYPE ole2_object. " 특정 열(Column)을 참조하는 OLE 객체
* 특정 열 선택
CALL METHOD OF GO_SHEET 'Columns' = lo_column
EXPORTING
#1 = p_column.
" GO_SHEET 객체에서 P_COLUMN(열 번호)에 해당하는 열을 참조하여 lo_column에 저장한다.
* 열 선택
CALL METHOD OF lo_column 'select'.
" lo_column 객체를 선택 상태로 만든다. 선택된 열은 이후 동작(예: 너비 조정)에 영향을 받는다.
* 현재 선택된 열에 대한 참조 가져오기
CALL METHOD OF go_application 'selection' = lo_selection.
" Excel 애플리케이션에서 현재 선택된 영역(Selection)을 가져와 lo_selection에 저장한다.
* 열 너비 설정
SET PROPERTY OF lo_column 'ColumnWidth' = p_width.
" lo_column 객체의 'ColumnWidth' 속성을 P_WIDTH 값으로 설정한다.
" 설정된 값은 해당 열(P_COLUMN)의 너비로 적용된다.
ENDFORM. "Column_width
ABAP
복사
하단에 구문 생기면 소스 넣어주기
FILL_CELL 구문에 해당 소스3줄 추가로 넣어준다.
DATA: lo_interior TYPE ole2_object.
CALL METHOD OF LV_ECELL 'Interior' = lo_interior.
SET PROPERTY OF lo_interior 'Color' = 65535.
ABAP
복사
DATA: lo_interior TYPE ole2_object.
" Excel 셀의 Interior(셀 내부 속성)를 참조하기 위한 OLE 객체 변수 선언.
CALL METHOD OF LV_ECELL 'Interior' = lo_interior.
" LV_ECELL 객체(특정 Excel 셀)를 통해 해당 셀의 Interior 속성을 가져온다.
" Interior는 Excel 셀 내부(배경)의 속성을 제어하기 위해 사용된다.
" 가져온 Interior 객체는 lo_interior 변수에 저장된다.
SET PROPERTY OF lo_interior 'Color' = 65535.
" Interior 객체의 'Color' 속성을 설정하여 셀의 배경 색상을 변경한다.
" 65535는 Excel의 색상 코드로, **노란색**(Yellow)을 나타낸다.
ABAP
복사
이런식으로 엑셀 파일이 다운된다
해당 빨간 부분의 주석 풀어주고 파랑부분 주석처리
DATA: lo_columns TYPE ole2_object.
" Excel의 모든 열(Columns)을 참조하는 OLE 객체 lo_columns를 선언.
" lo_columns는 워크시트 내 열의 속성 및 메서드에 접근할 수 있는 객체이다.
CALL METHOD OF go_application 'Columns' = lo_columns.
" Excel 애플리케이션(go_application) 객체에서 열(Columns) 전체를 참조하는 객체를 가져온다.
" 반환된 열 객체는 lo_columns 변수에 저장된다.
" 이 작업은 Excel의 전체 열에 대해 동작을 적용하기 위해 수행된다.
CALL METHOD OF lo_columns 'Autofit'.
" lo_columns 객체의 'Autofit' 메서드를 호출하여 열 너비를 자동으로 조정한다.
" Autofit은 각 열에 들어있는 데이터의 길이에 맞게 열 너비를 최적화한다.
" 이 동작은 Excel의 수동 작업인 "셀 크기에 맞게 열 너비 자동 조정"과 동일한 효과를 가진다.
ABAP
복사
그리고 밑에도 한줄을 주석을 풀어준다
CALL METHOD OF RANGE 'Merge'.
" Excel의 RANGE 객체에서 'Merge' 메서드를 호출하여 지정된 셀 범위를 병합한다.
" 병합된 셀은 하나의 큰 셀로 합쳐지며, 해당 범위 내 데이터는 중앙에 표시된다.
" 병합 동작은 Excel에서 '병합 및 가운데 맞춤(Merge & Center)' 기능과 유사하다.
ABAP
복사
이제 해당부분 다시 주석처리 원복시켜준다
엑셀에서 옵션에
개발도구를 체크해주고
확인누르고 진행하면 기록이 된다.
그러고 순수 똑같이 양식을 직접 만들어본다
Sub 매크로1()
'
' 매크로1 매크로
'
'
Range("A1").Select
ActiveCell.FormulaR1C1 = "MANDT"
Range("B1").Select
ActiveCell.FormulaR1C1 = "CARRID"
Range("C1").Select
ActiveCell.FormulaR1C1 = "CARRNAME"
Range("D1").Select
ActiveCell.FormulaR1C1 = "CURRCODE"
Range("E1").Select
ActiveCell.FormulaR1C1 = "URL"
Columns("A:E").Select
Selection.ColumnWidth = 15
Range("A1:E2").Select
Range("E1").Activate
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlMedium
End With
Selection.Borders(xlInsideVertical).LineStyle = xlNone
Selection.Borders(xlInsideHorizontal).LineStyle = xlNone
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection
.HorizontalAlignment = xlCenter
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.IndentLevel = 0
.ShrinkToFit = False
.ReadingOrder = xlContext
.MergeCells = False
End With
Range("A1:E1").Select
Range("E1").Activate
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("C4").Select
End Sub
ABAP
복사
보면 아밥소스에서 해준 설정들하고 겹친다.
결국 엑셀에서 매크로 돌려서 편집으로 소스보고 그거에 맞게 아밥에서 엑셀 설정을 잡아주면 된다.