You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SAP GUI嵌入Word文档中用OLE显示文本(不启动外部Word)

在SAP GUI内嵌Word文档中写入文本(基于i_oi_document_proxy)

问题梳理

你需要通过SAP Office Integration的i_oi_document_proxy在SAP GUI容器内嵌入Word文档,并将内表中的纯文本直接写入该内嵌文档,要求不启动独立的Word实例。此前尝试OLE2会创建外部Word进程,无法作用于内嵌文档。

解决方案

关键结论

无法直接用常规OLE2方式操作i_oi_document_proxy创建的内嵌文档——SAP Office Integration对底层OLE对象做了封装隔离。推荐以下两种可行方式:


方式1:用insert_document直接插入文本内表

这是最稳定的原生方法,无需依赖OLE,直接通过SAP Office Integration的API将内表文本写入内嵌Word文档。

实现步骤

  1. 准备soli类型的内表,填充要显示的文本内容
  2. 调用i_oi_document_proxy的insert_document方法,将文本插入到内嵌文档中

代码示例(新增写入文本的FORM)

FORM write_text_to_embedded_doc.
  DATA: lt_text TYPE STANDARD TABLE OF soli,
        lv_len  TYPE i.

  * 填充示例文本到内表
  APPEND INITIAL LINE TO lt_text ASSIGNING FIELD-SYMBOL(<line>).
  <line>-line = '这是从ABAP内表写入内嵌Word的文本'.
  APPEND INITIAL LINE TO lt_text ASSIGNING <line>.
  <line>-line = '第二行文本:测试SAP Office Integration功能'.

  * 计算文本总长度
  DESCRIBE TABLE lt_text LINES lv_len.
  lv_len = lv_len * 255.

  * 插入文本到内嵌Word文档
  IF NOT document IS INITIAL.
    CALL METHOD document->insert_document
      EXPORTING
        document_type       = 'TEXT'
        document_size       = lv_len
        insert_mode         = 'REPLACE' " 替换原有内容,可选'INSERT'追加
      CHANGING
        document_table      = lt_text
      EXCEPTIONS
        document_not_open   = 1
        invalid_parameter   = 2
        error_occurred      = 3
        OTHERS              = 4.

    IF sy-subrc <> 0.
      MESSAGE '写入文本失败' TYPE 'E'.
    ELSE.
      MESSAGE '文本已写入内嵌Word文档' TYPE 'I'.
    ENDIF.
  ENDIF.
ENDFORM.

方式2:通过get_ole2_object获取内嵌文档的OLE句柄(版本依赖)

部分SAP NetWeaver版本(如7.40及以上)的i_oi_document_proxy提供了get_ole2_object方法,可以直接获取内嵌文档的OLE对象,从而用OLE2语法操作该文档,且不会启动外部Word实例。

代码示例

FORM manipulate_embedded_doc_via_ole.
  DATA: lo_ole_doc TYPE ole2_object.

  IF NOT document IS INITIAL.
    * 获取内嵌文档的OLE句柄
    CALL METHOD document->get_ole2_object
      IMPORTING
        ole2_object = lo_ole_doc.

    * 用OLE2操作文档(例如写入文本、设置格式)
    CALL METHOD OF lo_ole_doc 'Content' = DATA(lo_content).
    CALL METHOD OF lo_content 'InsertAfter'
      EXPORTING
        #1 = '通过OLE2操作内嵌Word文档的文本'.

    * 释放OLE对象
    FREE OBJECT lo_content.
    FREE OBJECT lo_ole_doc.
  ENDIF.
ENDFORM.

修改后的完整程序代码

将上述方法整合到你的原有代码中,新增按钮触发文本写入:

*&---------------------------------------------------------------------*
*& Report ZDOCUMENT_OLE_COMBINED
*&---------------------------------------------------------------------*
*& 在SAP GUI内嵌Word文档并写入文本
*&---------------------------------------------------------------------*
REPORT ZDOCUMENT_OLE_COMBINED.

INCLUDE OLE2INCL.

DATA: container   TYPE REF TO cl_gui_custom_container,
      control     TYPE REF TO i_oi_container_control,
      document    TYPE REF TO i_oi_document_proxy,
      data_table  TYPE STANDARD TABLE OF soli,
      data_size   TYPE i,
      retcode     TYPE i.

DATA: gs_word TYPE ole2_object,
      gs_documents TYPE ole2_object,
      gs_actdoc TYPE ole2_object,
      gs_selection TYPE ole2_object,
      gs_font TYPE ole2_object.

START-OF-SELECTION.
  CALL SCREEN 0100.

MODULE status_100 OUTPUT.
  SET PF-STATUS 'MAIN0100'.
  SET TITLEBAR '001'.
ENDMODULE.

MODULE user_command_100 INPUT.
  CASE sy-ucomm.
    WHEN 'CREATE'.
      PERFORM create_new_document.
    WHEN 'WRITE_TEXT'. " 新增按钮功能码
      PERFORM write_text_to_embedded_doc.
    WHEN 'WRITE_OLE'. " 新增OLE操作按钮功能码
      PERFORM manipulate_embedded_doc_via_ole.
    WHEN 'SAVE'.
      PERFORM save_document_to_table.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.

FORM create_new_document.
  IF container IS INITIAL.
    CREATE OBJECT container
      EXPORTING
        container_name = 'CONTAINER'.
  ENDIF.

  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = control.

  CALL METHOD control->init_control
    EXPORTING
      r3_application_name    = 'Word Integration'
      inplace_enabled        = 'X'
      inplace_scroll_documents = 'X'
      parent                 = container
      register_on_close_event = 'X'
      no_flush               = ' '.

  CALL METHOD control->get_document_proxy
    EXPORTING
      document_type = 'Word.Document.8'
    IMPORTING
      document_proxy = document.

  CALL METHOD document->create_document
    EXPORTING
      open_inplace = 'X'.
ENDFORM.

FORM write_text_to_embedded_doc.
  DATA: lt_text TYPE STANDARD TABLE OF soli,
        lv_len  TYPE i.

  APPEND INITIAL LINE TO lt_text ASSIGNING FIELD-SYMBOL(<line>).
  <line>-line = '这是从ABAP内表写入内嵌Word的文本'.
  APPEND INITIAL LINE TO lt_text ASSIGNING <line>.
  <line>-line = '第二行文本:测试SAP Office Integration功能'.

  DESCRIBE TABLE lt_text LINES lv_len.
  lv_len = lv_len * 255.

  IF NOT document IS INITIAL.
    CALL METHOD document->insert_document
      EXPORTING
        document_type       = 'TEXT'
        document_size       = lv_len
        insert_mode         = 'REPLACE'
      CHANGING
        document_table      = lt_text
      EXCEPTIONS
        document_not_open   = 1
        invalid_parameter   = 2
        error_occurred      = 3
        OTHERS              = 4.

    IF sy-subrc <> 0.
      MESSAGE '写入文本失败' TYPE 'E'.
    ELSE.
      MESSAGE '文本已写入内嵌Word文档' TYPE 'I'.
    ENDIF.
  ENDIF.
ENDFORM.

FORM manipulate_embedded_doc_via_ole.
  DATA: lo_ole_doc TYPE ole2_object.

  IF NOT document IS INITIAL.
    CALL METHOD document->get_ole2_object
      IMPORTING
        ole2_object = lo_ole_doc.

    CALL METHOD OF lo_ole_doc 'Content' = DATA(lo_content).
    CALL METHOD OF lo_content 'InsertAfter'
      EXPORTING
        #1 = '通过OLE2操作内嵌Word文档的文本'.

    FREE OBJECT lo_content.
    FREE OBJECT lo_ole_doc.
  ENDIF.
ENDFORM.

FORM save_document_to_table.
  IF NOT document IS INITIAL.
    CALL METHOD document->save_document_to_table
      CHANGING
        document_table = data_table
        document_size  = data_size.

    IF sy-subrc = 0.
      MESSAGE '文档已保存到内表' TYPE 'I'.
    ELSE.
      MESSAGE '保存文档失败' TYPE 'E'.
    ENDIF.
  ENDIF.
ENDFORM.

MODULE exit_100 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.

  LEAVE PROGRAM.
ENDMODULE.

注意事项

  1. 方式1兼容性最好,所有支持SAP Office Integration的版本都可用
  2. 方式2需要确认SAP版本是否支持get_ole2_object方法,可通过SE24查看i_oi_document_proxy的方法列表
  3. 屏幕0100需创建名为CONTAINER的自定义容器控件,同时在PF-STATUSMAIN0100中添加WRITE_TEXT和WRITE_OLE按钮

内容的提问来源于stack exchange,提问作者that_girl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 11:45:19