안녕하세요.. 아밥 입문초짜 입니다....
갑자기 구현해야 할 프로그램이 생겨 문의 드립니다.
엑셀의 매크로를 이용해 양식을 출력하는 방법을 알고 싶습니다.
엑셀에 매크로를 작성하여 SAP 에 올리고 프로그램에서 값만 입력하면 양식을 출력할 수 있다고 하는데...
1. 엑셀 올리는 방법을 모르겠구여...ㅜㅜ
2. 프로그램에서 엑셀을 불러오는 방법도 모르겠습니다.
==> 엑셀과 프로그램 참고 예제로 알려주시면 정말 감사하겠습니다....
SAP에서 엑셀을 연동 시키는것은 BDC 를 제외하고는 첨이라 감도 안 오네요....
많은 분들의 조언 부탁드립니다.....ㅜㅜ
1. 매크로를 포함한 엑셀양식 작성
2. T-CODE : SMW0 를 이용하여 엑셀을 Upload
3. 업로드한 양식을 open 하여 데이터를 입력하고 해당 엑셀을 출력
[테스트 소스]
OBJECT ID 'YTEST' 로 빈엑셀을 SMW0 로 올려서 테스트 해보세요.
좋은 결과 있으시길..
TYPE-POOLS CNDP.
INCLUDE OFFICEINTEGRATIONINCLUDE. "오피스통합에 대한 인터페이스
INCLUDE OLE2INCL.
DATA : G_FACTORY TYPE REF TO I_OI_DOCUMENT_FACTORY,
G_CONTROL TYPE REF TO I_OI_CONTAINER_CONTROL,
G_DOCUMENT TYPE REF TO I_OI_DOCUMENT_PROXY,
G_SPREADSHEET TYPE REF TO I_OI_SPREADSHEET,
G_RETCODE TYPE T_OI_RET_STRING,
GT_SHEETS TYPE SOI_SHEETS_TABLE,
GS_SHEET TYPE SOI_SHEETS,
G_APP_NAME(50) TYPE C,
G_HAS TYPE I.
DATA: GS_RANGE TYPE SOI_RANGE_ITEM.
DATA: GT_RANGE TYPE SOI_RANGE_LIST.
DATA: GS_XLS_INPUT TYPE SOI_GENERIC_ITEM.
DATA: GT_XLS_INPUT TYPE SOI_GENERIC_TABLE.
DATA: L_DOC_SIZE TYPE I,
L_DOC_FORMAT(80) TYPE C,
L_URL TYPE C LENGTH 255,
L_DOC_TYPE(80) VALUE SOI_DOCTYPE_EXCEL97_SHEET, "엑셀
L_DOC_TABLE LIKE W3MIME OCCURS 0,
L_ERROR TYPE REF TO I_OI_ERROR.
START-OF-SELECTION.
* SMW0에 정의된 문서 정보 가져오기
CALL FUNCTION 'SAP_OI_LOAD_MIME_DATA'
EXPORTING
OBJECT_ID = 'YTEST' "SMW0 정의된 문서
IMPORTING
DATA_SIZE = L_DOC_SIZE
DOCUMENT_FORMAT = L_DOC_FORMAT
DOCUMENT_TYPE = L_DOC_TYPE
TABLES
DATA_TABLE = L_DOC_TABLE.
* URL 생성
CALL FUNCTION 'DP_CREATE_URL'
EXPORTING
TYPE = 'application'
SUBTYPE = 'x-oleobject'
SIZE = L_DOC_SIZE
TABLES
DATA = L_DOC_TABLE
CHANGING
URL = L_URL
EXCEPTIONS
OTHERS = 1.
* Factory create
CALL METHOD C_OI_FACTORY_CREATOR=>GET_DOCUMENT_FACTORY
IMPORTING
FACTORY = G_FACTORY
RETCODE = G_RETCODE.
* Start factory
CALL METHOD G_FACTORY->START_FACTORY
EXPORTING
R3_APPLICATION_NAME = G_APP_NAME
IMPORTING
RETCODE = G_RETCODE.
* Link factory & document
CALL METHOD G_FACTORY->GET_DOCUMENT_PROXY
EXPORTING
DOCUMENT_TYPE = L_DOC_TYPE
IMPORTING
DOCUMENT_PROXY = G_DOCUMENT
RETCODE = G_RETCODE.
* SMW0 문서의 Link URL 에 대한 문서 열기
CALL METHOD G_DOCUMENT->OPEN_DOCUMENT
EXPORTING
OPEN_INPLACE = 'X'
DOCUMENT_URL = L_URL.
* SpreadSheet 연결
CALL METHOD G_DOCUMENT->HAS_SPREADSHEET_INTERFACE
EXPORTING
NO_FLUSH = ' '
IMPORTING
IS_AVAILABLE = G_HAS.
CALL METHOD G_DOCUMENT->GET_SPREADSHEET_INTERFACE
EXPORTING
NO_FLUSH = ' '
IMPORTING
SHEET_INTERFACE = G_SPREADSHEET.
* SpreadSheet 의 Sheet 읽기
CALL METHOD G_SPREADSHEET->GET_SHEETS
EXPORTING
NO_FLUSH = ' '
IMPORTING
SHEETS = GT_SHEETS.
* Sheet 선택
READ TABLE GT_SHEETS INTO GS_SHEET INDEX 1.
CHECK SY-SUBRC IS INITIAL.
CALL METHOD G_SPREADSHEET->SELECT_SHEET
EXPORTING
NAME = GS_SHEET-SHEET_NAME.
* 선택된 시트에 데이터를 출력
PERFORM FILL_CELL USING 1 2 '테스트'.
* 기본프린터로 출력
CALL METHOD G_SPREADSHEET->PRINT
EXPORTING
NAME = GS_SHEET-SHEET_NAME
IMPORTING
ERROR = L_ERROR.
* 문서닫기
CALL METHOD G_DOCUMENT->CLOSE_DOCUMENT.
*&---------------------------------------------------------------------*
*& Form FILL_CELL
*&---------------------------------------------------------------------*
FORM FILL_CELL USING US_ROW TYPE ANY
US_COL TYPE ANY
US_VALUE TYPE ANY.
DATA: LV_COL TYPE I,
LV_ROW TYPE I.
LV_COL = US_COL.
LV_ROW = US_ROW.
* 엑셀에 출력할 Cell 지정
CALL METHOD G_SPREADSHEET->INSERT_RANGE_DIM
EXPORTING
NAME = 'CELL'
NO_FLUSH = 'X'
TOP = LV_ROW "" 출력위치 row
LEFT = LV_COL "" 출력위치 col
ROWS = 1 "" 범위 : row ( 1 X 1 => single cell )
COLUMNS = 1. "" 범위 : col
CLEAR: GT_RANGE, GT_XLS_INPUT.
GS_RANGE-NAME = 'CELL'.
GS_RANGE-ROWS = LV_ROW.
GS_RANGE-COLUMNS = LV_COL.
APPEND GS_RANGE TO GT_RANGE.
GS_XLS_INPUT-COLUMN = LV_ROW.
GS_XLS_INPUT-ROW = LV_COL.
GS_XLS_INPUT-VALUE = US_VALUE.
APPEND GS_XLS_INPUT TO GT_XLS_INPUT.
* set data
CALL METHOD G_SPREADSHEET->SET_RANGES_DATA
EXPORTING
RANGES = GT_RANGE
CONTENTS = GT_XLS_INPUT
NO_FLUSH = 'X'.
ENDFORM. " FILL_CELL