一個好玩的OLE 導出Excel

一、ole相關內容

OLE(Object Linking & Embedding【對象鏈接與嵌入技術】),對Excel輸出格式有特殊要求時使用,但是導出較慢

OLE配置 Table : TOLE , OLELOAD(存儲了所有ole相關的關鍵字)       

T-code : SOLE(ole配置視圖) ,OLE(ole範例)

二、OLE實現方式

數據定義-> 創建Excel對象->保存Excel對象-> 創建Excel工作頁面->在workbook中添加worksheet->對單元格的操作->顯示

通過Excel 宏來查看關鍵字

 三、OLE的實現

1)ole數據定義

TYPE-POOLS: OLE2 .

DATA: GV_EXCEL     TYPE OLE2_OBJECT,
      GV_SHEET     TYPE OLE2_OBJECT,
      GV_WORKBOOKS TYPE OLE2_OBJECT,
      GV_CELL      TYPE OLE2_OBJECT,
      GV_FONT      TYPE OLE2_OBJECT,
      GV_RANGE     TYPE OLE2_OBJECT,
      GV_COLOR     TYPE OLE2_OBJECT,
      GV_COLUMNS   TYPE OLE2_OBJECT ,
      GV_BORDER    TYPE OLE2_OBJECT
      .

DEFINE __ADD_CELL.
* get cell position
  CALL METHOD OF GV_EXCEL 'CELLS' = GV_CELL
    EXPORTING
      #1 = &1
      #2 = &2 .
* set value in cell
  SET PROPERTY OF GV_CELL 'VALUE' = &3 .

*set call style
  CALL METHOD OF GV_CELL 'FONT' = GV_FONT .
  SET PROPERTY OF GV_FONT 'BOLD' = &4.
  SET PROPERTY OF GV_FONT 'SIZE' = &5 .
  IF &6 = GC_X.
     SET PROPERTY OF GV_CELL 'HORIZONTALALIGNMENT' = -4108 .
  ENDIF.

END-OF-DEFINITION.

2) OLE數據錄入

FORM CALL_OLE .
  DATA LV_ROW TYPE I VALUE 3.
  DATA LV_TEMP TYPE N LENGTH 5 VALUE 3.
  DATA LV_FIELD TYPE N LENGTH 10.
  FIELD-SYMBOLS :<FS_FILED> TYPE ANY .

* CREATE EXCEL OBJECT
  CREATE OBJECT GV_EXCEL 'EXCEL.APPLICATION'.

  SET PROPERTY OF GV_EXCEL 'VISIBLE' = 0. " 1 / 0

* ADD A NEW WORK
  CALL METHOD OF GV_EXCEL 'WORKBOOKS' = GV_WORKBOOKS .
  CALL METHOD OF GV_WORKBOOKS 'ADD'.

*  CALL METHOD  OF GV_EXCEL 'ACTIVATE'.
  __ADD_CELL: 1 1 'alibaba 招聘簡章' 1 22 'X' .
*   MERGECELLS

  SET PROPERTY OF GV_CELL 'HORIZONTALALIGNMENT' = -4108 . "CENTER
  CALL METHOD OF GV_EXCEL 'RANGE' = GV_RANGE
      EXPORTING
        #1 = 'A1'
        #2 = 'J2'.
  CALL METHOD OF GV_RANGE 'SELECT' .
  SET PROPERTY OF GV_RANGE 'MERGECELLS' = 1 .


  __ADD_CELL: 3 1 '公司發佈編碼' 1 12 'X' .
  __ADD_CELL: 3 2 '公司編碼'     1 12 'X' .
  __ADD_CELL: 3 3 '公司名稱'     1 12 'X' .
  __ADD_CELL: 3 4 '公司地址'     1 12 'X' .
  __ADD_CELL: 3 5 '郵箱'         1 12 'X' .
  __ADD_CELL: 3 6 '崗位需求'     1 12 'X' .
  __ADD_CELL: 3 7 '你崗位需求量' 1 12 'X' .
  __ADD_CELL: 3 8 '薪資'         1 12 'X' .
  __ADD_CELL: 3 9  '必要要求'    1 12 'X' .
  __ADD_CELL: 3 10 '工作地點'    1 12 'X' .

  LOOP AT GT_COMPANY .
    LV_ROW = LV_ROW + SY-INDEX .
    DO 10 TIMES.
      ASSIGN COMPONENT SY-INDEX OF STRUCTURE GT_COMPANY TO <FS_FILED> .
      __ADD_CELL: LV_ROW SY-INDEX <FS_FILED> 0 12 'X' .
      IF SY-INDEX = 7.
        CALL METHOD OF GV_CELL 'INTERIOR' = GV_COLOR .
        SET PROPERTY OF GV_COLOR 'COLORINDEX' = 6. " SET COLOR

      ENDIF.
*      DO 4 TIMES. " SET CELL BORDER
*        CALL METHOD OF GV_CELL 'BORDERS' = GV_BORDER
*           EXPORTING #1 = SY-INDEX.
*
*        SET PROPERTY OF GV_BORDER 'LINESTYLE' = 1 .
*        SET PROPERTY OF GV_BORDER 'WEIGHT'    = 2 .
*      ENDDO.
    ENDDO.
  ENDLOOP.

  CALL METHOD OF GV_EXCEL 'COLUMNS' = GV_COLUMNS . "AUTO OLUMENS

  CALL METHOD OF GV_COLUMNS 'AUTOFIT'.

  "SELECT ALL CELL, YOU WILL ADD BORDERS
  LV_TEMP = LV_ROW .
  CONDENSE LV_TEMP NO-GAPS .
  CONCATENATE 'J' LV_TEMP INTO LV_FIELD .


  CALL METHOD OF GV_EXCEL 'RANGE' = GV_RANGE
      EXPORTING
        #1 = 'A1'
        #2 = LV_FIELD.
  CALL METHOD OF GV_RANGE 'SELECT' .
  DO 4 TIMES. " ALL BORDERS
    CALL METHOD OF GV_RANGE 'BORDERS' = GV_BORDER
         EXPORTING #1 = SY-INDEX.

      SET PROPERTY OF GV_BORDER 'LINESTYLE' = 1 .
      SET PROPERTY OF GV_BORDER 'WEIGHT'    = 2 .
  ENDDO.

PERFORM SAVE_EXCEL .


ENDFORM.

3) 保存表單

FORM SAVE_EXCEL .
   DATA LV_FNAME(255) .
  LV_FNAME = 'E:\OLETEST_XLS'.
* SAVEAS SHEET
   GET PROPERTY OF GV_EXCEL 'ActiveSheet' = GV_SHEET .
   CALL METHOD OF GV_SHEET 'SAVEAS'
   EXPORTING
     #1 = LV_FNAME
     #2 = 1 .
*   FREE OBJECT GV_SHEET .
*
*  GET PROPERTY OF GV_EXCEL 'ActiveWorkbook' = GV_WORKBOOKS .
*  CALL METHOD OF GV_WORKBOOKS 'SAVE'.

* CLOSE EXCEL
 CALL METHOD OF GV_EXCEL 'QUIT' .
 FREE OBJECT GV_SHEET.
 FREE OBJECT GV_WORKBOOKS.
 FREE OBJECT GV_EXCEL .
 IF SY-SUBRC EQ 0 .
   MESSAGE 'SUCESS' TYPE 'S' .
 ENDIF.
ENDFORM.

輸出效果 

四、 此外還可以通過上傳模板的方式,直接利用模板做輸出

        smw0上傳模板->獲取模板->ole打開->修改需要字段

1)獲取模板

FORM GET_MODE .
  TABLES WWWDATA .
  DATA LV_DEFAULT_FILENAME TYPE STRING VALUE 'ZSTUDENT_MODE'.
  DATA LV_FILENAME    TYPE STRING .
  DATA LV_PATH        TYPE STRING .
  DATA LV_FULLPATH    TYPE STRING .
  DATA LV_MSG    TYPE STRING .
  DATA LO_OBJID  TYPE WWWDATATAB .
  DATA LV_DESTINATION TYPE RLGRAP-FILENAME .
  DATA LV_RC TYPE SY-SUBRC .
  DATA: LV_OBJID TYPE WWWDATATAB-OBJID,
        LV_DEST  TYPE SAPB-SAPPFAD.

  LV_OBJID = 'ZSTUDENT'.
  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG
    EXPORTING
*     WINDOW_TITLE      =
      DEFAULT_EXTENSION = 'xls'
      DEFAULT_FILE_NAME = LV_DEFAULT_FILENAME
*     WITH_ENCODING     =
*     FILE_FILTER       =
*     INITIAL_DIRECTORY =
*     PROMPT_ON_OVERWRITE       = 'X'
    CHANGING
      FILENAME          = LV_FILENAME
      PATH              = LV_PATH
      FULLPATH          = LV_FULLPATH
*     USER_ACTION       =
*     FILE_ENCODING     =
*    EXCEPTIONS
*     CNTL_ERROR        = 1
*     ERROR_NO_GUI      = 2
*     NOT_SUPPORTED_BY_GUI      = 3
*     INVALID_DEFAULT_FILE_NAME = 4
*     OTHERS            = 5
    .
  IF SY-SUBRC <> 0.
*   Implement suitable error handling here
    MESSAGE S030(ZGJX) WITH 'open error'.
*   & & & &

  ENDIF.
  CHECK SY-SUBRC EQ 0 .
  LV_DEST = LV_FULLPATH .

  SELECT SINGLE RELID OBJID
    FROM WWWDATA
    INTO CORRESPONDING FIELDS OF LO_OBJID
    WHERE SRTF2 = 0 AND RELID = 'MI' AND OBJID = LV_OBJID .
  IF SY-SUBRC <> 0 OR LO_OBJID-OBJID EQ '' .
    CONCATENATE 'The Mode File, ' LV_DEFAULT_FILENAME 'is null'
    INTO LV_MSG .
    MESSAGE LV_MSG TYPE 'I'.

  ENDIF.

  LV_DESTINATION = LV_DEST .
  CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
    EXPORTING
      KEY         = LO_OBJID
      DESTINATION = LV_DESTINATION
    IMPORTING
      RC          = LV_RC
*     CHANGING
*     TEMP        =
    .
  IF LV_RC NE 0 .
    CONCATENATE 'THE MODE FILE, ' LV_DEFAULT_FILENAME 'DOWNLOAD FAILED'
           INTO LV_MSG .
    MESSAGE LV_MSG TYPE 'E'.

  ENDIF.
  GV_FILENAME  = LV_DESTINATION .


ENDFORM.

2)給每一行添加數據

FORM ADD_DATA .
  CREATE OBJECT GV_EXCEL 'EXCEL.APPLICATION'.
  IF SY-SUBRC <> 0.
    EXIT .
  ENDIF.
*
  SET PROPERTY OF GV_EXCEL 'VISIBLE' = 1.
*
** OPEN MODE EXCEL

  CALL METHOD OF GV_EXCEL 'WORKBOOKS' = GV_WORKBOOKS .
  CALL METHOD OF GV_WORKBOOKS 'OPEN'
    EXPORTING
      #1 = GV_FILENAME.

  CALL METHOD OF GV_EXCEL 'SHEETS' = GV_SHEET
     EXPORTING
       #1 = 1 .

  CALL METHOD OF GV_SHEET 'SELECT' .

  CALL METHOD OF GV_SHEET 'ACTIVATE' .

  LOOP AT GT_MAIN INTO <FS_MAIN>.
    GV_INDEX = SY-SUBRC + 2.
    IF SY-TABIX EQ 1.
      PERFORM EXCEL_ROW_INSERT USING GV_SHEET .
    ENDIF.

    DO '列數' TIMES.
      "賦值
    ENDDO.

  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  EXCEL_ROW_INSERT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GV_SHEET  text
*      -->P_1      text
*----------------------------------------------------------------------*
FORM EXCEL_ROW_INSERT  USING PV_SHEET
                               .
  DATA LV_RANGE TYPE OLE2_OBJECT .
  DATA LV_BORDERS TYPE OLE2_OBJECT .

  CALL METHOD OF PV_SHEET 'ROWS' = LV_RANGE
  EXPORTING
    #1 = 2 .
  CALL METHOD OF LV_RANGE 'COPY'.
  CALL METHOD OF PV_SHEET 'ROWS' = LV_RANGE
   EXPORTING
    #1 = GV_INDEX .
  CALL METHOD OF LV_RANGE 'INSERT'.
  CALL METHOD OF LV_RANGE 'CLEARCONTENTS'.

ENDFORM.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章