简单abap OLE实例

OLE分大致3步:

1.SMW0上传模板到服务器

2.在程序中下载模板

3.下载完模板后,打开模板文件,填入数据


1.SMW0上传模板到服务器:不详细叙述

excel模板内容如下:



2.编程

*&---------------------------------------------------------------------*
*& Report  ZLEARNING12_OLE_FIST
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT ZLEARNING12_OLE_FIST.
INCLUDE OLE2INCL.
*&---------------------------------------------------------------------*
*&内表和工作区声明
*&---------------------------------------------------------------------*
DATA: it_data TYPE TABLE OF MAKT WITH HEADER LINE, "
      wa_data LIKE LINE OF it_data.                   "

DATA: workbook TYPE OLE2_OBJECT,  
      excel TYPE ole2_object,
      sheet TYPE ole2_object,
      cell TYPE ole2_object.
DATA: fname LIKE rlgrap-filename.
DATA: index TYPE i.

TABLES: MAKT.
*&---------------------------------------------------------------------*
*&选择屏幕的定义
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK blk0 WITH FRAME TITLE text-001.
SELECT-OPTIONS: S_MATNR FOR MAKT-MATNR. "
SELECT-OPTIONS: S_SPRAS FOR MAKT-SPRAS . "

SELECTION-SCREEN END OF BLOCK blk0.

*&---------------------------------------------------------------------*
*&INITIALIZATION
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&选择屏幕事件
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&START-OF-SELECTION 程序开始
*&---------------------------------------------------------------------*
START-OF-SELECTION.

  PERFORM temp_excel_get USING 'ZOLE3011' ."从服务器下载模板
*   下载完模板后,打开模板文件,填入数据
  PERFORM frm_excel_open.

*  &---------------------------------------------------------------------*
*取数放到it_data
  PERFORM frm_get_data.

*将取出的数放入excel
  LOOP AT it_data INTO wa_data.
    index = sy-tabix + 2."从第三行开始写入数据
*
    PERFORM excel_row_insert USING sheet index 1.
    PERFORM fill_range USING index 1 wa_data-MANDT.
    PERFORM fill_range USING index 2 wa_data-MATNR.
    PERFORM fill_range USING index 3 wa_data-SPRAS.
    PERFORM fill_range USING index 4 wa_data-MAKTX.
    PERFORM fill_range USING index 5 wa_data-MAKTG.
  ENDLOOP.


*设置EXCEL中所插入的数据行边框线格式为黑色有边框

*  bod = tab.
*  CONDENSE bod NO-GAPS.
*  CONCATENATE 'A6:F' bod INTO bod.
*
*  PERFORM borderrange USING excel bod.

  PERFORM sub_excel_save."保存excel数据

*  PERFORM frm_data_display.
**&---------------------------------------------------------------------*
**& END-OF-SELECTION 程序结束
**&---------------------------------------------------------------------*
*
*&---------------------------------------------------------------------*
*&子程序部分
*&---------------------------------------------------------------------*




*下载EXCEL模板FORM
*----------------------------------------------------------------------*
*      -->VALUE(templat)    上传的excel模板名
*      <--VALUE(ls_destination)    返回excel文件模板对象
*      
*----------------------------------------------------------------------*
FORM  temp_excel_get USING template TYPE any.
  DATA:  lo_objdata LIKE wwwdatatab,
         lo_mime LIKE w3mime,
         lc_filename  TYPE string VALUE 'ole',"默认名
         lc_fullpath  TYPE string ,  "C:\Users\yang\Desktop\文件名
         lc_path      TYPE  string , "C:\Users\yang\Desktop\   不包括文件名
         ls_destination LIKE rlgrap-filename,
         ls_objnam TYPE string,
         li_rc LIKE sy-subrc,
         ls_errtxt TYPE string.
  DATA:p_objid TYPE wwwdatatab-objid,
       p_dest LIKE sapb-sappfad.
*  p_objid = 'ZOLE3011'. "此处为EXCEL模板名称
   p_objid = template.
  CONCATENATE lc_filename '_' SY-DATUM '_' SY-UZEIT 
              INTO lc_filename.  "给模板命名
  CALL METHOD cl_gui_frontend_services=>file_save_dialog "调用保存对话框
    EXPORTING
      default_extension    = 'XLS'
      default_file_name    = lc_filename
    CHANGING
      filename             = lc_filename
      path                 = lc_path
      fullpath             = lc_fullpath
    EXCEPTIONS
      cntl_error           = 1
      error_no_gui         = 2
      not_supported_by_gui = 3
      OTHERS               = 4.
  IF lc_fullpath = ''.
    MESSAGE  '不能打开excel' TYPE 'E'.
  ENDIF.
  IF sy-subrc = 0.
    p_dest = lc_fullpath.
*    concatenate p_objid '.XLS' into ls_objnam.
    CONDENSE ls_objnam NO-GAPS.
    SELECT SINGLE relid objid FROM wwwdata INTO CORRESPONDING FIELDS OF lo_objdata
           WHERE srtf2 = 0 AND relid = 'MI' AND objid = p_objid.

*检查表wwwdata中是否存在所指定的模板文件
    IF sy-subrc NE 0 OR lo_objdata-objid EQ space."如果不存在,则给出错误提示
      CONCATENATE '模板文件' ls_objnam '不存在' INTO ls_errtxt.
      MESSAGE ls_errtxt TYPE 'I'.
    ENDIF.
    ls_destination = p_dest. "保存路径

*如果存在,调用DOWNLOAD_WEB_OBJECT 函数下载模板到路径下
    CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
      EXPORTING
        key         = lo_objdata
        destination = ls_destination
      IMPORTING
        rc          = li_rc.
    IF li_rc NE 0.
      CONCATENATE '模板文件:' ls_objnam '下载失败' INTO ls_errtxt.
      MESSAGE ls_errtxt TYPE 'E'.
    ENDIF.
      fname = ls_destination.  "fname 全局
  ENDIF.
ENDFORM.                    "fm_excel



*&---------------------------------------------------------------------*
*&      Form  FRM_EXCEL_OPEN
*&---------------------------------------------------------------------*
*       打开excel
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_EXCEL_OPEN .
  CLEAR: workbook,excel,sheet,cell,index.
  CREATE OBJECT excel 'EXCEL.APPLICATION'.  "Create EXCEL OBJECT
  IF sy-subrc NE 0.
    EXIT.
  ENDIF.
  SET PROPERTY OF excel 'Visible' = 1.  "1/0 是否立即显示EXCEL

  CALL METHOD OF
      excel
      'Workbooks' = workbook.

  CALL METHOD OF
      workbook
      'Open'

    EXPORTING
      #1       = fname."打开上面下载路径下的excel文件

  CALL METHOD OF
      excel 'Sheets' = sheet
    EXPORTING
      #1       = 1.

  CALL METHOD OF
      sheet 'Select'.

  CALL METHOD OF sheet 'ACTIVATE'. "sheet 激活

*  SET PROPERTY OF sheet 'NAME' = sheetname. "设定sheet名称
  SET PROPERTY OF sheet 'NAME' = 'SHEET1'.

ENDFORM.                    " FRM_EXCEL_OPEN




*&---------------------------------------------------------------------*
*& 向excel中的指定行插入N行
*&---------------------------------------------------------------------*
FORM excel_row_insert USING lcobj_sheet
                            lc_row
                            lc_count.
  DATA lc_range TYPE ole2_object.
  DATA h_borders  TYPE ole2_object.
  DO lc_count TIMES.
    CALL METHOD OF
        lcobj_sheet
        'Rows'      = lc_range
      EXPORTING
        #1          = 6.
    CALL METHOD OF lc_range 'Copy'.  "COPY第6行插入一个新行
    CALL METHOD OF
        lcobj_sheet
        'Rows'      = lc_range
      EXPORTING
        #1          = lc_row.
    CALL METHOD OF
        lc_range
        'Insert'.
    CALL METHOD OF lc_range 'ClearContents'. "是否需要清空Cell
  ENDDO.
ENDFORM.                    "excel_row_insert

*&---------------------------------------------------------------------*
*&      Form  fill_range
*&---------------------------------------------------------------------*
*       text  填充EXCEL 单元格
*----------------------------------------------------------------------*
*      -->VALUE(F_ROW)    text
*      -->VALUE(F_COL)    text
*      -->VALUE(F_VALUE)  text
*----------------------------------------------------------------------*
FORM fill_range USING value(f_row)
                      value(f_col)
                      value(f_value).
  DATA:
    row TYPE i,
    col TYPE i.
  row = f_row.
  col = f_col.
  CALL METHOD OF
      excel
      'CELLS' = cell
    EXPORTING
      #1      = row
      #2      = col.
  SET PROPERTY OF cell 'VALUE' = f_value.
ENDFORM.                    "fill_range

*&---------------------------------------------------------------------*
*&      Form  borderrange
*&---------------------------------------------------------------------*
*       text:设置EXCEL中所插入的数据行边框线格式

*----------------------------------------------------------------------*
*      -->LCOBJ_EXCEL  text
*      -->RANGE        text
*----------------------------------------------------------------------*
FORM borderrange USING lcobj_excel
                       range .
  DATA: lc_cell TYPE ole2_object ,
        lc_borders TYPE ole2_object .
  CALL METHOD OF
      lcobj_excel
      'RANGE'     = lc_cell
    EXPORTING
      #1          = range.
  DO 4 TIMES .
    CALL METHOD OF
        lc_cell
        'BORDERS' = lc_borders
      EXPORTING
        #1        = sy-index.
    SET PROPERTY OF lc_borders 'LineStyle' = '1'.
    SET PROPERTY OF lc_borders 'WEIGHT' = 2.                "4=max
    SET PROPERTY OF lc_borders 'ColorIndex' = '1'.
  ENDDO.
  FREE OBJECT lc_borders.
  FREE OBJECT lc_cell.
ENDFORM.                    "borderrange
*&---------------------------------------------------------------------*
*&      Form  FRM_GET_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM FRM_GET_DATA .
  CLEAR: it_data, wa_data.
  SELECT *
    FROM MAKT UP TO 5 ROWS
    INTO CORRESPONDING FIELDS OF TABLE it_data
    WHERE MAKT~MATNR IN s_matnr
    AND MAKT~spras IN S_SPRAS.
ENDFORM.                    " FRM_GET_DATA

*&---------------------------------------------------------------------*
*&      Form  sub_excel_save
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM sub_excel_save.
  GET PROPERTY OF excel 'ActiveSheet' = sheet. "获取活动SHEET
  FREE OBJECT sheet.
  FREE OBJECT workbook.

  GET PROPERTY OF excel 'ActiveWorkbook' = workbook.
  CALL METHOD OF
      workbook
      'SAVE'.

  SET PROPERTY OF excel 'Visible' = 1.  "是否显示EXCEL 此处显示不退出

* SET PROPERTY OF excel 'Visible' = 1.

*  CALL METHOD OF workbook 'CLOSE'.
*  CALL METHOD OF excel 'QUIT'. 注释部分为不显示直接退出

  FREE OBJECT sheet.
  FREE OBJECT workbook.
  FREE OBJECT excel.
ENDFORM.                    "save_book


运行效果(只显示前五行数据):


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值