DOI输出EXCEL的例子

DOI(Desktop Office Integration)是SAI提供的与OFFICE集成的技术,他的功能非常的强大,甚至可以使用EXCEL公式和VBA扩展功能。有关DOI的详细介绍请参看SAP Library 的指定章节。有详细的结构定义和方法说明。


用DOI实现用EXCEL输出报表的功能是比较有用的。我们今天就以此为例讲解一下DOI的使用。也就是把一个制作好的EXCEL的模板文件通过 事务代码 OAOR 导入到系统中备用。然后写程序用DOI技术读取该模板,向模板中填写数据。最后输出出来。因为可以支持公式和VBA扩展功能,所以可以实现自动计算、统计以及EXCEL图标功能。

(1) 用OAOR 导入EXCEL文件



(2)然后就可以编程用DOI实现报表的输出:

为了输出EXCEL,需要创建一个屏幕,并在屏幕上放置一个容器,详细代码如下:

   *&---------------------------------------------------------------------*
*& Report  ZZKP052
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT  ZLJC_TEST NO STANDARD PAGE HEADING .

DATAdocument_name(30VALUE 'TESTDOI',
      active_sheet(50VALUE 'Sheet1'.
CONSTANTS inplace VALUE 'X'.

DATAcontainer   TYPE REF TO cl_gui_custom_container,
      control     TYPE REF TO i_oi_container_control,
      document    TYPE REF TO i_oi_document_proxy,
      spreadsheet TYPE REF TO i_oi_spreadsheet,
      error       TYPE REF TO i_oi_error,
      errors TYPE REF TO i_oi_error OCCURS WITH HEADER LINE.
DATArangeitem TYPE soi_range_item.
DATAranges TYPE soi_range_list.
DATAexcel_input TYPE soi_generic_table.
DATAexcel_input_wa TYPE soi_generic_item.
DATAinitialized(1), retcode TYPE soi_ret_string.
DATAitem_url(256), already_donenewname(40).
DATA  document_type(80).
DATAexcel(80VALUE 'Excel.Sheet'.
DATAline_count TYPE i,
      column_count TYPE i.
DATAok_code LIKE sy-ucomm.

PARAMETERS flag.

START-OF-SELECTION.
  CALL SCREEN 100.

*&——————————————————————-
*&      Module  OUTPUT_TO_EXCEL  OUTPUT
*&——————————————————————-
MODULE status_0100 OUTPUT.
  SET PF-STATUS '100'.
*  创建EXCEL模板
  PERFORM create_basic_objects USING ''  '' '' '' document_name.
*  输出EXCEL
  PERFORM output_to_excel.
ENDMODULE.                 "' OUTPUT_TO_EXCEL  OUTPUT

*———————————————————————*
*       FORM create_basic_objects                                     *
*———————————————————————*
FORM  create_basic_objects USING p_app_name
                                 p_classname
                                 p_classtype
                                 p_obj_key
                                 p_docname.
  DATA l_app_name(200).
  DATAbds_instance TYPE REF TO cl_bds_document_set.
  DATAdoc_signature TYPE sbdst_signature,
        wa_doc_signature LIKE LINE OF doc_signature,
        doc_components TYPE sbdst_components,
        doc_uris TYPE sbdst_uri,
        wa_doc_uris LIKE LINE OF doc_uris.
  DATAdoc_classname TYPE sbdst_classname VALUE 'PICTURES',
        doc_classtype TYPE sbdst_classtype VALUE 'OT',
        doc_object_key TYPE sbdst_object_key VALUE 'EXCEL'.

  CHECK initialized IS INITIAL.

*  处理参数
 IF p_app_name IS INITIAL.
    l_app_name 'R/3 Reporter'.
  ELSE.
    l_app_name p_app_name.
  ENDIF.

    IF  NOT (  p_classname IS INITIAL OR p_classtype IS INITIAL
           OR p_obj_key IS INITIAL ).
    doc_classname =  p_classname.
    doc_classtype =  p_classtype.
    doc_object_key p_obj_key.
  ENDIF.


*  创建容器控制器实例
  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control control
      error   error.
  CALL METHOD error->raise_message
    EXPORTING
      type 'E'.
*  创建屏幕上的容器对象
  CREATE OBJECT container
    EXPORTING
      container_name 'CONTAINER'.

*  初始化容器控制器
  CALL METHOD control->init_control
    EXPORTING
      r3_application_name      l_app_name
      inplace_enabled          inplace
      inplace_scroll_documents 'X'
      parent                   container
      register_on_close_event  'X'
      register_on_custom_event 'X'
      no_flush                 'X'
    IMPORTING
      error                    errors.
  APPEND errors.
  CLEAR item_url.

  wa_doc_signature-prop_name 'DESCRIPTION'.
  document_type excel.
  wa_doc_signature-prop_value p_docname.

  APPEND wa_doc_signature TO doc_signature.
*  BDS对象实例化
  CREATE OBJECT bds_instance.
*  读取BDS内容(模板)
  CALL METHOD bds_instance->get_info
    EXPORTING
      classname  doc_classname
      classtype  doc_classtype
      object_key doc_object_key
    CHANGING
      components doc_components
      signature  doc_signature.
*   读取BDS的URL
  CALL METHOD bds_instance->get_with_url
    EXPORTING
      classname  doc_classname
      classtype  doc_classtype
      object_key doc_object_key
    CHANGING
      uris       doc_uris
      signature  doc_signature.

  FREE bds_instance.
  READ TABLE doc_uris INTO wa_doc_uris INDEX 1.
  item_url wa_doc_uris-uri.

* ask the SAP DOI container for a i_oi_document_proxy for Excel
*  容器控制器获得一个EXCEL文档代理
  CALL METHOD control->get_document_proxy
    EXPORTING
      document_type  'Excel.Sheet'
      no_flush       'X'
    IMPORTING
      document_proxy document
      error          errors.
  APPEND errors.

* open a document saved in business document service.
*  容器控制器中打开指定BDS返回的文档
  CALL METHOD document->open_document
    EXPORTING
      open_inplace inplace
      document_url item_url.

  DATAhas TYPE i.
  CALL METHOD document->has_spreadsheet_interface
    EXPORTING
      no_flush     ''
    IMPORTING
      is_available has
      error        errors.
  APPEND errors.
  CALL METHOD document->get_spreadsheet_interface
    EXPORTING
      no_flush        ' '
    IMPORTING
      sheet_interface spreadsheet
      error           errors.
  APPEND errors.

* Activate  sheet
  CALL METHOD spreadsheet->select_sheet
    EXPORTING
      name     active_sheet
      no_flush ''
    IMPORTING
      error    errors.
  APPEND errors.

*错误处理
  LOOP AT errors.
    CALL METHOD errors->raise_message
      EXPORTING
        type 'S'.
  ENDLOOP.
  FREE errors.

  initialized 'X'.
ENDFORM.              "' CREATE_BASIC_OBJECTS

*———————————————————————*
*       FORM output_to_excel                                          *
*———————————————————————*
FORM output_to_excel.
  DATAtmpdate(10TYPE c.
  column_count 2.

  line_count 2.
  PERFORM fill_cell USING line_count
                          column_count
                          'TEST1'.
  line_count line_count + 1.
  PERFORM fill_cell USING line_count
                          column_count
                          'TEST2'.
  column_count column_count + 1.
  PERFORM fill_cell USING line_count
                          column_count
                          'ljc'.
*    call METHOD spreadsheet->PROTECT
*    EXPORTING
*      protect = 'X'.

ENDFORM.                    "output_to_excel

*———————————————————————*
*       FORM fill_cell                                                *
*———————————————————————*
FORM fill_cell  USING j val.
  DATAcolumns_number TYPE i,
        rows_number    TYPE i.

  columns_number 1.
  rows_number 1.

  CALL METHOD spreadsheet->insert_range_dim
    EXPORTING
      name     'cell'
      no_flush 'X'
      top      i
      left     j
      rows     rows_number
      columns  columns_number
    IMPORTING
      error    errors.
  APPEND errors.

  REFRESHrangesexcel_input.
  rangeitem-name 'cell'.
  rangeitem-columns 1.
  rangeitem-rows 1.
  APPEND rangeitem TO ranges.

  excel_input_wa-column 1.
  excel_input_wa-row 1.
  excel_input_wa-value val.
  APPEND excel_input_wa TO excel_input.

* set data
  CALL METHOD spreadsheet->set_ranges_data
    EXPORTING
      ranges   ranges
      contents excel_input
      no_flush 'X'
    IMPORTING
      error    errors.
  APPEND errors.

  CALL METHOD spreadsheet->fit_widest
    EXPORTING
      name     space
      no_flush 'X'.

  REFRESHrangesexcel_input.

ENDFORM.                    "fill_cell

*&———————————————————————*
*&      Module  EXIT  INPUT
*&———————————————————————*
MODULE user_command_0100 INPUT.
  IF NOT document IS INITIAL.
    CALL METHOD document->close_document.
    FREE document.
  ENDIF.
  IF NOT control IS INITIAL.
    CALL METHOD control->destroy_control.
    FREE control.
  ENDIF.
  SET SCREEN .
ENDMODULE.                 " EXIT  INPUT


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以为您提供一个ABAP DOI输出Excel文件的完整示例代码。 在这个示例中,我们将使用ABAP DOI创建一个数据对象并将其导出到Excel文件中。下面是示例代码: ``` DATA: lo_doi TYPE REF TO if_doi, lo_obj TYPE REF TO zcl_my_data_object, lt_data TYPE STANDARD TABLE OF zcl_my_data_object, lr_excel TYPE REF TO cl_bcs_convert=>type_excel, ls_excel TYPE bcs_excel, lv_file TYPE string. * 创建 ABAP DOI 对象 CREATE OBJECT lo_doi. * 创建数据对象 lo_obj = lo_doi->create_transient( iv_class_name = 'ZCL_MY_DATA_OBJECT' iv_properties = VALUE #( ( name = 'ID' value = '001' ) ( name = 'TEXT' value = 'This is a sample text for my data object' ) ) ). * 将数据对象添加到内部表中 APPEND lo_obj TO lt_data. * 将数据导出到 Excel 文件 lr_excel = cl_bcs_convert=>create( cl_bcs_convert=>type_excel ). ls_excel-data = lt_data. ls_excel-sheetname = 'My Data Object'. lr_excel->add_data( ls_excel ). lv_file = 'C:\temp\my_data_object.xlsx'. CALL FUNCTION 'GUI_DOWNLOAD' EXPORTING filename = lv_file TABLES data_tab = lr_excel->get_data( ). ``` 在这个示例中,首先创建了一个ABAP DOI对象lo_doi。然后定义了一个数据对象类型zcl_my_data_object,并使用create_transient方法创建了一个数据对象lo_obj,并设置了ID和TEXT属性的值。 接着将数据对象lo_obj添加到内部表lt_data中。然后使用CL_BCS_CONVERT类创建一个Excel导出对象lr_excel,并设置Excel文件名和工作表名称。 最后,将内部表lt_data导出到Excel文件中,并保存到本地磁盘上的文件lv_file中。这里使用了GUI_DOWNLOAD函数来实现文件下载。 希望这个示例能够帮助您理解如何使用ABAP DOI输出Excel文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ChampaignWolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值