使用OLE实现操作EXCEL的,是从服务器已经上传的EXCEL模板中下载模板然后打开修改实现数据保存。也可以直接创建 新的EXCEL文件往里面传递数据并设置格式。
- 上传模板——SMW0 WebRFC 的二进制数据 ,模板数据保存在系统表wwwdata中。
- 程序中下载模板
*& Form FRM_DOWNLOAD_EXCEL_FROMSERVER
*&---------------------------------------------------------------------*
* 从服务器下载模板
*----------------------------------------------------------------------*
* -->PL_OBJID:模板名称
* -->PL_DEST:模板的保存路径
*----------------------------------------------------------------------*
FORM f_download_excel_fromserver USING pl_objid TYPE wwwdatatab-objid
pl_dest TYPE rlgrap-filename.
DATA: l_objdata LIKE wwwdatatab,
l_mime LIKE w3mime,
l_objnam TYPE string,
l_rc LIKE sy-subrc,
l_errtxt TYPE string.
CONCATENATE pl_objid '.XLS' INTO l_objnam.
CONDENSE l_objnam NO-GAPS.
* 检查模板是否存在
SELECT SINGLE relid objid FROM wwwdata
INTO (l_objdata-relid, l_objdata-objid)
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = pl_objid.
* 模板不存在
IF sy-subrc <> 0 OR l_objdata-objid = space.
MESSAGE e002(zsd) WITH l_objnam.
ENDIF.
* 下载模板到指定路径
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = l_objdata
destination = pl_dest
IMPORTING
rc = l_rc.
* 下载模板失败
IF l_rc <> 0.
MESSAGE '下载模板失败!' type 'S'.
ENDIF.
ENDFORM. "FRM_DOWNLOAD_EXCEL_FROMSERVER
- 打开模板填充数据
*&---------------------------------------------------------------------*
*& Form F_OPEN_EXCEL_HIDE
*&---------------------------------------------------------------------*
*& 初始化OLE控件并打开模版文件同时前台不可见
*&---------------------------------------------------------------------*
* -->PL_FILENAME :要打开的Excel文件
* <--PL_APPLICATION:Excel进程
* <--PL_WORKBOOK :工作簿
* <--PL_SUBRC :执行结果返回值
*----------------------------------------------------------------------*
FORM f_open_excel_hide USING pl_filename TYPE rlgrap-filename
CHANGING pl_application TYPE ole2_object
pl_workbook TYPE ole2_object
pl_subrc TYPE sy-subrc.
* 创建Excel进程
CREATE OBJECT pl_application 'EXCEL.APPLICATION'.
* 设置Excel进程不可见
SET PROPERTY OF pl_application 'Visible' = 0.
* 打开已有的Excel文件
CALL METHOD OF pl_application 'WORKBOOKS' = pl_workbook.
CALL METHOD OF pl_workbook 'OPEN'
EXPORTING #1 = pl_filename.
* 打开Excel文件是否成功的返回值
pl_subrc = sy-subrc.
* 如果打开成功继续执行后继代码,如果失败退出当前子程序
CHECK pl_subrc = 0.
* 得到当前活动工作簿
GET PROPERTY OF pl_application 'ACTIVEWORKBOOK' = pl_workbook.
CALL METHOD OF pl_application 'CELLS' = cell. "工作表全选
ENDFORM. " F_OPEN_EXCEL_HIDE
- 填充数据
*& Form FILL_CELL
*&---------------------------------------------------------------------*
* 向指定的单元格填充数据
*----------------------------------------------------------------------*
* -->PL_ROW :单元格所在的行
* -->PL_COL :单元格所在的列
* -->PL_VALUE :单元格的值
* <--PL_APPLICATION:Excel进程
*----------------------------------------------------------------------*
FORM f_fill_cell USING pl_row TYPE i
pl_col TYPE i
pl_value TYPE c
CHANGING pl_application TYPE ole2_object.
DATA l_cells TYPE ole2_object.
* 选中单元格
CALL METHOD OF pl_application 'Cells' = l_cells
EXPORTING
#1 = pl_row
#2 = pl_col.
* 设置值
SET PROPERTY OF l_cells 'value' = pl_value.
ENDFORM. "FILL_CELL
- 关闭excel写操作
FORM close_excel USING pl_application TYPE ole2_object
pl_workbook TYPE ole2_object.
CALL METHOD OF pl_workbook 'SAVE'. "保存
CALL METHOD OF pl_application 'QUIT'.
FREE OBJECT pl_application.
FREE OBJECT pl_workbook .
ENDFORM. "CLOSE_EXCEL