zoukankan      html  css  js  c++  java
  • 使用OLE2对象(操使作EXCEL:把内表中的数据在EXCEL中显示出来)

    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

  • 相关阅读:
    Ural_1018. Binary Apple Tree(树形DP)
    2011 Asia Shanghai Regional Contest Problem A
    Ural_1012. Kbased Numbers. Version 2(dp)
    HDU_1524 A Chess Game (sg函数)
    HDU_1760 A New Tetris Game(dfs + 博弈)
    POJ_2023 Choose Your Own Adventure(DFS)
    POJ_3267 The Cow Lexicon(DP)
    Qt 的QString类的使用
    用QFileSystemModel和Listview做的简易图片浏览
    Qt 对文件的操作
  • 原文地址:https://www.cnblogs.com/huangjianisgood/p/2719301.html
Copyright © 2011-2022 走看看