您的位置:首页 > 其它

使用OLE2对象(操使作EXCEL:把内表中的数据在EXCEL中显示出来)

2015-01-21 10:31 387 查看
SAP:ABAP: 使用OLE2对象(操使作EXCEL:把内表中的数据在EXCEL中显示出来)
*&---------------------------------------------------------------------*
*& Report  ZTEST_OLE_EXCEL
*&
*&---------------------------------------------------------------------*
*&  测试OLE EXCEL
*&---------------------------------------------------------------------*
REPORT  ZTEST_OLE_EXCEL
MESSAGE-ID ZTEST.

*&---------------------------------------------------------------------*
*& TYPE-POOLS
*&---------------------------------------------------------------------*
TYPE-POOLS:
OLE2.      "或者:INCLUDE OLE2INCL

*&---------------------------------------------------------------------*
*& 定义数据
*&---------------------------------------------------------------------*
DATA:
TD_BKPF TYPE TABLE OF BKPF,
TH_BKPF TYPE BKPF.

DATA:
W_TMP_FILE(65) TYPE C.

* OLE2对象
DATA:
W_EXCEL TYPE OLE2_OBJECT,  "EXCEL
W_BOOKS TYPE OLE2_OBJECT,  "LIST OF WORKBOOKS
W_BOOK  TYPE OLE2_OBJECT,  "WORKBOOK
W_SHEET TYPE OLE2_OBJECT,  "SHEET
W_CELL  TYPE OLE2_OBJECT.  "CELL OF SHEET

CONSTANTS:

* 前面一定要添加'MI'
CNS_DOWN_KEY TYPE WWWDATATAB VALUE 'MIZTSTOLE_EXCEL',
CNS_DOWN_PATH TYPE LOCALFILE VALUE 'C:\ZTST_TMP.XLT',  "下载地址
* 部分字符串
CNS_VISIBLE TYPE CHAR32 VALUE 'VISIBLE',
CNS_WORKBOOKS TYPE CHAR32 VALUE 'WORKBOOKS',
CNS_OPEN TYPE CHAR32 VALUE 'OPEN',
CNS_WORKSHEETS TYPE CHAR32 VALUE 'WORKSHEETS',
CNS_ACTIVATE TYPE CHAR32 VALUE 'ACTIVATE',
CNS_RANGE TYPE CHAR32 VALUE 'RANGE',
CNS_VALUE TYPE CHAR32 VALUE 'VALUE'.

*&---------------------------------------------------------------------*
*& 选择屏幕
*&---------------------------------------------------------------------*
PARAMETERS:
P_BUKRS TYPE BKPF-BUKRS OBLIGATORY,  "公司代码
P_GJAHR TYPE BKPF-GJAHR OBLIGATORY.   "会计年度

*&---------------------------------------------------------------------*
*&  START-OF-SELECTION
*&---------------------------------------------------------------------*
START-OF-SELECTION.

* 取得数据
PERFORM FRM_GET_BKPF_DATA.

*-从SAP服务器上下载模板(要先通过SMWO上传)
PERFORM FRM_DOWN_TEMPLATE.

*-向EXCEL中填入数据,并显示出来
PERFORM FRM_EXPORT_DATA.

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_BKPF_DATA
*&---------------------------------------------------------------------*
*       取得数据
*----------------------------------------------------------------------*
FORM FRM_GET_BKPF_DATA .

SELECT *
FROM BKPF
INTO TABLE TD_BKPF
WHERE BUKRS = P_BUKRS
AND GJAHR = P_GJAHR.

IF SY-SUBRC <> 0.
*    MESSAGE S001 DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.

ENDFORM.                    " FRM_GET_BKPF_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_DOWN_TEMPLATE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM FRM_DOWN_TEMPLATE .
DATA:
LW_SUBRC TYPE SY-SUBRC.

* 显示进度
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
EXPORTING
PERCENTAGE       = 0
TEXT             = 'Download the template!'.
* 下载sap服务器上的RFC模板(html)
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
KEY               = CNS_DOWN_KEY
DESTINATION       = CNS_DOWN_PATH
IMPORTING
RC                = LW_SUBRC
CHANGING
TEMP              = W_TMP_FILE.

IF LW_SUBRC <> 0.
*    MESSAGE 'DOWNLOAD TEMPLATE FALL!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.

ENDFORM.                    " FRM_DOWN_TEMPLATE

*&---------------------------------------------------------------------*
*&      Form  FRM_EXPORT_DATA
*&---------------------------------------------------------------------*
*       向EXCEL中填入数据,并显示出来
*----------------------------------------------------------------------*
FORM FRM_EXPORT_DATA .
DATA:
LW_H TYPE CHAR2,
LW_S TYPE CHAR2.

* 创建EXCEL
CREATE OBJECT W_EXCEL 'EXCEL.APPLICATION'.
SET PROPERTY OF W_EXCEL CNS_VISIBLE = 0.
* 设置可见
*  SET PROPERTY OF W_EXCEL CNS_VISIBLE = 1 NO FLUSH.
* 创建EXCEL的WORKSBOOKS
CALL METHOD OF W_EXCEL CNS_WORKBOOKS = W_BOOKS.
* 创建BOOK FOR WORKSBOOKS
CALL METHOD OF W_BOOKS CNS_OPEN = W_BOOK
EXPORTING
#1 = CNS_DOWN_PATH.

CALL METHOD OF W_BOOK CNS_WORKSHEETS = W_SHEET
EXPORTING
#1 = 'Sheet1'.

CALL METHOD OF W_SHEET CNS_ACTIVATE.

* 输出到EXCEL
LW_S = '4'.
LOOP AT TD_BKPF INTO TH_BKPF.

LW_H = 'A'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-BUKRS.

LW_H = 'B'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-BELNR.

LW_H = 'C'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-GJAHR.

LW_H = 'D'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-BLART.

LW_H = 'E'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-BLDAT.

LW_H = 'F'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-BUDAT.

LW_H = 'G'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-MONAT.

LW_H = 'H'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-CPUDT.

LW_H = 'I'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-XBLNR.

LW_H = 'J'.
PERFORM FRM_FILL_CELL USING LW_H LW_S TH_BKPF-BKTXT.

LW_S = LW_S + 1.

ENDLOOP.

* 设置可见
SET PROPERTY OF W_EXCEL CNS_VISIBLE = 1 NO FLUSH.

FREE OBJECT:
W_EXCEL,
W_BOOKS,
W_BOOK,
W_SHEET,
W_CELL.

ENDFORM.                    " FRM_EXPORT_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_FILL_CELL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->i_H  text
*      -->i_S  text
*      -->i_value  text
*----------------------------------------------------------------------*
FORM FRM_FILL_CELL  USING  VALUE(I_H)
VALUE(I_S)
VALUE(I_VALUE).
DATA:
LW_CELL TYPE CHAR4.

* 填充单元格(定位)
CONCATENATE I_H I_S INTO LW_CELL.
CALL METHOD OF W_SHEET CNS_RANGE = W_CELL
EXPORTING
#1 = LW_CELL.
* 插入值
SET PROPERTY OF W_CELL CNS_VALUE = I_VALUE.

ENDFORM.                    " FRM_FILL_CELL


2012-10-11 08:33:41 黄健

TYPE-POOLS: ole2 .
1.    SMW0 上传Excel模板

2.    在程序中调用
变量声明:
DATA: l_excel_obj     TYPE ole2_object,
l_workbook_obj  TYPE ole2_object,
l_sheet_obj     TYPE ole2_object.

DATA: l_fname     LIKE rlgrap-filename,
l_filename  TYPE string,
l_icount    TYPE i,
l_irow      TYPE i.

2.2    取得模板文件和路径
PERFORM  temp_excel_get CHANGING l_fname.

FORM temp_excel_get  CHANGING fname.

DATA:  l_objdata     LIKE wwwdatatab,
l_destination LIKE rlgrap-filename,
l_rc          LIKE sy-subrc,
l_errtxt      TYPE string.

SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF l_objdata
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = 'ZP001MMR019'. "此处为EXCEL模板名称

* 检查表wwwdata中是否存在所指定的模板文件
IF sy-subrc NE 0 OR
l_objdata-objid = space."如果不存在,则给出错误提示
CONCATENATE '保函交接模板文件' '不存在' INTO l_errtxt.
MESSAGE l_errtxt TYPE 'E'.
ENDIF.

l_destination = 'C:\保函交接单.XLS'.

* 如果存在,调用DOWNLOAD_WEB_OBJECT 函数下载模板到路径下
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key         = l_objdata
destination = l_destination
IMPORTING
rc          = l_rc.
IF l_rc NE 0.
CONCATENATE '保函交接单模板文件:' l_destination '下载失败' INTO l_errtxt.
MESSAGE l_errtxt TYPE 'E'.
ENDIF.

fname = l_destination.

ENDFORM.                    " TEMP_EXCEL_GET

2.3    以模板生成文件
PERFORM open_excel_file USING  l_excel_obj
l_workbook_obj
l_sheet_obj
l_fname
'1' .

FORM open_excel_file  USING l_excel
l_workbook
l_sheet
l_filename
l_visible.
CREATE OBJECT l_excel 'Excel.Application'.
IF sy-subrc NE 0.
MESSAGE e796(f9) WITH '不能创建Excel对象'.
ENDIF.
CALL METHOD OF l_excel 'Workbooks' = l_workbook.
CALL METHOD OF l_workbook 'Open'   = l_workbook
EXPORTING #1 = l_filename.
IF sy-subrc NE 0.
MESSAGE e796(f9) WITH '打开文件错误'.
ENDIF.
SET PROPERTY OF l_excel 'Visible'   = l_visible.
CALL METHOD OF  l_workbook 'Sheets' = l_sheet
EXPORTING #1 = 1.
ENDFORM.                    " OPEN_EXCEL_FILE
2.4    插入表格行数
计算内表的行数
DESCRIBE TABLE gt_out LINES l_icount.
l_icount = l_icount - 1.

复制空行数
PERFORM excel_row_insert  USING l_sheet_obj
'4'
l_icount.

FORM excel_row_insert USING l_sheet
l_row
l_count.
DATA l_range TYPE ole2_object.
DO l_count TIMES.
CALL METHOD OF l_sheet 'Rows' = l_range
EXPORTING #1 = l_row.
CALL METHOD OF l_range 'Copy'.
CALL METHOD OF l_sheet 'Rows' = l_range
EXPORTING #1 = l_row.
CALL METHOD OF l_range 'Insert'.
CALL METHOD OF l_range 'ClearContents'. "是否需要清空Cell
ENDDO.
ENDFORM.                    " EXCEL_ROW_INSERT
2.5    写值到表格中
l_irow = 3.
LOOP AT gt_out.
l_irow = l_irow + 1.
PERFORM write_item USING l_excel_obj
l_irow.
ENDLOOP.

FORM write_item  USING    l_excel_obj
l_row.
DATA: l_count TYPE i.
l_count = l_row - 3.
PERFORM excel_cell_write USING l_excel_obj
l_row
'A'
l_count.

PERFORM excel_cell_write USING l_excel_obj
l_row
'B'
gt_out-bhno.
ENDFORM.                    " WRITE_ITEM

FORM excel_cell_write USING l_excel
l_row
l_col
l_value.
DATA: l_cell TYPE ole2_object.
CALL METHOD OF l_excel 'Cells' = l_cell
EXPORTING #1 = l_row
#2 = l_col.
SET PROPERTY OF l_cell 'Value' = l_value.
ENDFORM.                    " EXCEL_CELL_WRITE
3.    拓展,多个Sheet
3.1 在Excel中录制宏
宏名称:SheetCopy
宏代码:
Sub SheetCopy()
'
' SheetCopy Macro
Sheets("Sheet1").Select
Sheets("Sheet1").Copy After:=Sheets(1)
End Sub
3.2    创建Sheet个数
DATA:
l_excel_obj     TYPE ole2_object,
l_workbook_obj  TYPE ole2_object,
l_sheet_obj     TYPE ole2_object.
DATA:
l_sheet_name TYPE string,
l_sheetno   TYPE i,
l_sheetcnt  TYPE i.

PERFORM create_sheets USING l_excel_obj
l_sheetcnt.

FORM create_sheets  USING  l_excel_obj
l_hcount.
DO l_hcount TIMES.
CALL METHOD OF l_excel_obj 'RUN'
EXPORTING
#1 = 'SheetCopy'.
ENDDO.
ENDFORM.                    " CREATE_SHEETS

3.3     修改Sheet名称
PERFORM change_sheetname USING l_workbook_obj
l_sheet_obj
l_sheet_name
l_sheetno.

FORM change_sheetname  USING  l_workbook_obj
l_sheet_obj
l_sheet_name
l_sheetno.
CALL METHOD OF l_workbook_obj 'Sheets' = l_sheet_obj
EXPORTING
#1 = ls_sheetno.
SET PROPERTY OF l_sheet_obj 'Name' = l_sheet_name.
CALL METHOD OF l_sheet_obj 'Activate' .
ENDFORM.                    " CHANGE_SHEETNAME
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: