如何在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文档。
实现步骤
- 准备
soli类型的内表,填充要显示的文本内容 - 调用
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兼容性最好,所有支持SAP Office Integration的版本都可用
- 方式2需要确认SAP版本是否支持
get_ole2_object方法,可通过SE24查看i_oi_document_proxy的方法列表 - 屏幕
0100需创建名为CONTAINER的自定义容器控件,同时在PF-STATUSMAIN0100中添加WRITE_TEXT和WRITE_OLE按钮
内容的提问来源于stack exchange,提问作者that_girl
相关产品推荐
相关产品推荐

