EXCEL——DOI操作EXCEL方法封装(包含动态创建操作SHEET页)

本文介绍如何使用EXCEL的DOI(Data Object Interface)进行操作,重点讲解了SE24类的构建,源码解析以及具体的使用实例,包括动态创建SHEET页面的方法。
摘要由CSDN通过智能技术生成

一、SE24 构建类
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
二、基于源码

class ZCLFI00170 definition
  public
  final
  create public .

public section.

  data V_CONTAINER type ref to CL_GUI_CONTAINER .
  data V_CONTROL type ref to I_OI_CONTAINER_CONTROL .
  data V_DOCUMENT type ref to I_OI_DOCUMENT_PROXY .
  data V_SPREADSHEET type ref to I_OI_SPREADSHEET .
  data V_ERROR type ref to I_OI_ERROR .
  data V_BDS_DOCUMENTS type ref to CL_BDS_DOCUMENT_SET .
  data V_DOC_COMPONENTS type SBDST_COMPONENTS .
  data V_DOC_SIGNATURE type SBDST_SIGNATURE .
  data T_BDS_URIS type SBDST_URI .
  data CL_ERROR type ref to I_OI_ERROR .
  data:
    v_bds_url like line of t_bds_uris .
  data:
    v_template_url(256) type c .

  methods OPEN_EXCEL
    importing
      !I_CLASSNAME type SBDST_CLASSNAME
      !I_CLASSTYPE type SBDST_CLASSTYPE
      !I_OBJECTKEY type SBDST_OBJECT_KEY .
  methods FILL_DATA_TO_EXCEL
    importing
      !I_TOP type I
      !I_LEFT type I
      !I_ROWS type I
      !I_COLUMNS type I
      !I_RANGES type SOI_RANGE_LIST
      !I_CONTENTS type SOI_GENERIC_TABLE .
  methods DOWNLOAD_EXCEL
    importing
      !I_PATH type C
      !I_FILENAME type C .
  methods CLOSE_EXCEL .
  methods ADD_SHEET
    importing
      !SHEET_NAME type CHAR20 .
  methods SET_SHEET_NAME
    importing
      !NEW_NAME type CHAR20
      !OLD_NAME type CHAR20 .
  methods DELETE_SHEET
    importing
      !SHEET_NAME type CHAR20 .
  methods SELECT_SHEET
    importing
      !SHEET_NAME type CHAR20 default 'Sheet1' .
protected section.
private section.

  methods INIT_CONTAINER .
  methods GET_TEMPLATE_URL
    importing
      !I_CLASSNAME type SBDST_CLASSNAME
      !I_CLASSTYPE type SBDST_CLASSTYPE
      !I_OBJECTKEY type SBDST_OBJECT_KEY .
ENDCLASS.



CLASS ZCLFI00170 IMPLEMENTATION.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCLFI00170->ADD_SHEET
* +-------------------------------------------------------------------------------------------------+
* | [--->] SHEET_NAME                     TYPE        CHAR20
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method ADD_SHEET.

    call method v_spreadsheet->ADD_SHEET
     exporting
       NAME       = SHEET_NAME
       NO_FLUSH   = 'X'.

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCLFI00170->CLOSE_EXCEL
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method CLOSE_EXCEL.
    if not v_document is initial.
      call method v_document->close_document.
      free v_document.
    endif.

    if not v_control is initial.
      call method v_control->destroy_control.
      free v_control.
    endif.

    if v_container is not initial.
      call method v_container->free.
    endif.
  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCLFI00170->DELETE_SHEET
* +-------------------------------------------------------------------------------------------------+
* | [--->] SHEET_NAME                     TYPE        CHAR20
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD DELETE_SHEET.

    CALL METHOD V_SPREADSHEET->DELETE_SHEET
      EXPORTING
        NAME     = SHEET_NAME
        NO_FLUSH = 'X'.

  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCLFI00170->DOWNLOAD_EXCEL
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_PATH                         TYPE        C
* | [--->] I_FILENAME                     TYPE        C
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method DOWNLOAD_EXCEL.
    data: l_filename type c length 270.
    concatenate i_path i_filename into l_filename.
    call method v_document->save_as
      exporting
       file_name = l_filename
      importing
       error     = v_error.

    if v_error->has_failed eq 'X'.
     call method v_error->raise_message
      exporting
        type = 'I'.
    endif.

    call method close_excel.

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCLFI00170->FILL_DATA_TO_EXCEL
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_TOP                          TYPE        I
* | [--->] I_LEFT                         TYPE        I
* | [--->] I_ROWS                         TYPE        I
* | [--->] I_COLUMNS                      TYPE        I
* | [--->] I_RANGES                       TYPE        SOI_RANGE_LIST
* | [--->] I_CONTENTS                     TYPE        SOI_GENERIC_TABLE
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD FILL_DATA_TO_EXCEL .

    CALL METHOD V_SPREADSHEET->INSERT_RANGE_DIM
      EXPORTING
        NAME     = 'cell'
        NO_FLUSH = 'X'
        TOP      = I_TOP  "6
        LEFT     = I_LEFT  "3
        ROWS     = I_ROWS "3
        COLUMNS  = I_COLUMNS. "1

    CALL METHOD V_SPREADSHEET->SET_RANGES_DATA
      EXPORTING
        RANGES   = I_RANGES
        CONTENTS = I_CONTENTS
        NO_FLUSH = 'X'.
  ENDMETHOD.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCLFI00170->GET_TEMPLATE_URL
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_CLASSNAME                    TYPE        SBDST_CLASSNAME
* | [--->] I_CLASSTYPE                    TYPE        SBDST_CLASSTYPE
* | [--->] I_OBJECTKEY                    TYPE        SBDST_OBJECT_KEY
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method GET_TEMPLATE_URL.
    create object v_bds_documents.

    call method cl_bds_document_set=>get_info
       exporting
         classname  = i_classname
         classtype  = i_classtype
         object_key = i_objectkey
       changing
         components = v_doc_components
         signature  = v_doc_signature.

    call method cl_bds_document_set=>get_with_url
       exporting
         classname  = i_classname
         classtype  = i_classtype
         object_key = i_objectkey
       changing
         uris       = t_bds_uris
         signature  = v_doc_signature.

     free v_bds_documents.
     read table t_bds_uris into v_bds_url index 1.
     v_template_url = v_bds_url-uri.
  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Private Method ZCLFI00170->INIT_CONTAINER
* +-------------------------------------------------------------------------------------------------+
* +--------------------------------------------------------------------------------------</SIGNATURE>
   method INIT_CONTAINER.
    v_container = cl_gui_container=>screen0.

    "create container control
    call method c_oi_container_control_creator=>get_container_control
    importing
      control = v_control.

    "initialize control
    call method v_control->init_control
      exporting
        inplace_enabled          = 'X '
        inplace_scroll_documents = 'X'
        register_on_close_event  = 'X'
        register_on_custom_event = 'X'
        r3_application_name      = 'DOI'
        parent                   = v_container.

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCLFI00170->OPEN_EXCEL
* +-------------------------------------------------------------------------------------------------+
* | [--->] I_CLASSNAME                    TYPE        SBDST_CLASSNAME
* | [--->] I_CLASSTYPE                    TYPE        SBDST_CLASSTYPE
* | [--->] I_OBJECTKEY                    TYPE        SBDST_OBJECT_KEY
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method OPEN_EXCEL.

    call method init_container.
    call method get_template_url exporting i_classname = i_classname i_classtype = i_classtype i_objectkey = i_objectkey.
    call method v_control->get_document_proxy
      exporting
        document_type      = 'Excel.Sheet'
        no_flush           = 'X'
        register_container = 'X'
      importing
        document_proxy     = v_document.

    call method v_document->open_document
      exporting
        open_inplace = 'X'
        document_url = v_template_url.

    data: l_available type i.
    call method v_document->has_spreadsheet_interface
      exporting
        no_flush     = 'X'
      importing
        is_available = l_available.

    call method v_document->get_spreadsheet_interface
      exporting
        no_flush        = 'X'
      importing
        sheet_interface = v_spreadsheet.

*    call method v_spreadsheet->select_sheet
*      exporting
*        name     = 'Sheet1'
*        no_flush = 'X'
*      importing
*        error = cl_error.

  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCLFI00170->SELECT_SHEET
* +-------------------------------------------------------------------------------------------------+
* | [--->] SHEET_NAME                     TYPE        CHAR20 (default ='Sheet1')
* +--------------------------------------------------------------------------------------</SIGNATURE>
  method SELECT_SHEET.
    CALL METHOD V_SPREADSHEET->SELECT_SHEET
      EXPORTING
        NAME     = SHEET_NAME
        NO_FLUSH = 'X'
      IMPORTING
        ERROR    = CL_ERROR.
  endmethod.


* <SIGNATURE>---------------------------------------------------------------------------------------+
* | Instance Public Method ZCLFI00170->SET_SHEET_NAME
* +-------------------------------------------------------------------------------------------------+
* | [--->] NEW_NAME                       TYPE        CHAR20
* | [--->] OLD_NAME                       TYPE        CHAR20
* +--------------------------------------------------------------------------------------</SIGNATURE>
  METHOD SET_SHEET_NAME.
    CALL METHOD V_SPREADSHEET->SET_SHEET_NAME
      EXPORTING
        NEWNAME  = NEW_NAME
        OLDNAME  = OLD_NAME
        NO_FLUSH = 'X'.
  ENDMETHOD.
ENDCLASS.

三、使用实例

*&---------------------------------------------------------------------*
*& Program ID : ZCOR0010
*& Description: MC 日式损益表
*&---------------------------------------------------------------------*
*& Created by : Mitchell Wang                Date: 2019/07/09 Ver: 01.0
*&---------------------------------------------------------------------*
*& Modified by: author                       Date: YYYY/MM/DD Ver: 02.0
*&   … Description of modification …
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZCOR0010.


" 类型
TYPES:BEGIN OF TY_LRZX,
        COALL    TYPE GRPDYNP-NAME_COALL,    " 利润中心组
        DESCRIPT TYPE CHAR40,                " 组描述
        PRCTR    TYPE BSEG-PRCTR,            " 利润中心
        ZBS      TYPE CHAR1,                 " 标识
      END OF TY_LRZX.
TYPES:BEGIN OF TY_SHEET,
        NUMBER     TYPE CHAR2,
        SHEET_NAME TYPE CHAR20,
        TEXT       TYPE CHAR50,
        ZBS        TYPE CHAR1,                 " 组标识 / 集标识
      END OF TY_SHEET.
TYPES:BEGIN OF TP_PMON,
        SPMON TYPE S031-SPMON,
      END OF TP_PMON.
TYPES:T_PRCTR TYPE STANDARD TABLE OF ZFIS035.

"  变量
DATA:L_PMON TYPE S031-SPMON ##NEEDED.
DATA:TY_COALL TYPE GRPDYNP-NAME_COALL,
     TY_RCNTR TYPE BSEG-PRCTR.
"equired for writing data to Excel
DATA: V_RANGES      TYPE SOI_RANGE_LIST ##NEEDED,
      V_RANGE       TYPE SOI_RANGE_ITEM ##NEEDED,
      V_CONTENTS    TYPE SOI_GENERIC_TABLE ##NEEDED,
      V_CONTENT     TYPE SOI_GENERIC_ITEM ##NEEDED,
      V_CONTENTS_SJ TYPE SOI_GENERIC_TABLE ##NEEDED,
      V_CONTENT_SJ  TYPE SOI_GENERIC_ITEM ##NEEDED.

" 内表 结构
DATA:T_LRZX TYPE STANDARD TABLE OF TY_LRZX ##NEEDED,
     W_LRZX TYPE TY_LRZX ##NEEDED.
DATA:T_SHEET TYPE STANDARD TABLE OF TY_SHEET ##NEEDED,
     W_SHEET TYPE TY_SHEET ##NEEDED.

DATA:T_ZFIT016 TYPE STANDARD TABLE OF ZFIT016 ##NEEDED,
     W_ZFIT016 TYPE ZFIT016 ##NEEDED.
DATA:VR_RACCT TYPE RANGE OF FAGLFLEXT-RACCT ##NEEDED,
     VW_RACCT LIKE LINE OF VR_RACCT ##NEEDED.
DATA:VR_PRCTR TYPE RANGE OF BSEG-PRCTR ##NEEDED,
     VW_PRCTR LIKE LINE OF VR_PRCTR ##NEEDED.
DATA:T_PMON_JP TYPE TABLE OF TP_PMON ##NEEDED,
     W_PMON_JP TYPE TP_PMON ##NEEDED.
DATA:T_PMON_NUM TYPE TABLE OF TP_PMON ##NEEDED,
     W_PMON_NUM TYPE TP_PMON ##NEEDED.
DATA:T_PMON_CN TYPE TABLE OF TP_PMON ##NEEDED,
     W_PMON_CN TYPE TP_PMON ##NEEDED.

" 宏定义
DEFINE SET_PRCTR.
  clear VW_PRCTR.
  VW_PRCTR-sign   = 'I'.
  VW_PRCTR-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值