如何创建WORD模板(将SAP OLE链接添加到文档)?

2020-08-25 13:13发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好!


经过非常深入的搜索,我到达了墙,无法再进一步移动:(

我知道有关如何初始化DOI的编码过程。 然后,如何为模板中的链接添加映射,如何在RAW数据中加载模板并使用更改后的值打开文档。 但是..

问题:如何准备这样的WORD文档模板? 文档非常复杂,我已经有了局部语言,但是没有变量(SAP OLE链接,SAP Demo模板的MS WORD附带的屏幕)。 因此,最好的选择是在特定位置输入局部语言,然后上传模板并将其另存为ITAB到SAP DB表中的RAW。

SAP演示模板此处

如果有人要寻找有关如何使用RAW模板的过程,请在其中更改变量并在此处打开doc(缩短版本):

 FORM doi_initialize
    使用p_cust_cont_name
    将po_control类型参考更改为i_oi_container_control
             po_document类型参考i_oi_document_proxy
             po_link_server类型参考i_oi_link_server
            po_gui_cust_container类型参考cl_gui_custom_container。

 数据:l_retcode类型soi_ret_string。

     创建对象po_gui_cust_container
       出口
         container_name = p_cust_cont_name。

     调用方法c_oi_container_control_creator => get_container_control
       输入
         控制= po_control
         retcode = l_retcode。

     调用方法po_control-> init_control
       出口
         r3_application_name ='文件导出'(010)
         inplace_enabled ='X'
         父母= po_gui_cust_container
       输入
         retcode = l_retcode。

   调用方法po_control-> get_document_proxy
     出口
       document_type = soi_doctype_word_document"'Word.Document'
       document_format = soi_docformat_compound"'OLE'
     输入
       document_proxy = po_document
       retcode = l_retcode。

   调用方法po_control-> get_link_server
     输入
       link_server = po_link_server
       retcode = l_retcode。
 
  调用方法po_link_server-> start_link_server [...]
 ENDFORM。  " DOI_INITIALIZE


 FORM export_values2word
    使用p_blart
           po_link_server类型参考i_oi_link_server
           ps_flds_value类型zfm_res_add_data_mswordole_trg。

   数据:l_retcode类型soi_ret_string。
 ************** WORD中的变量1

   呼叫方法po_link_server-> add_string_item
   出口
     item_name ='Z_var1'
     item_value = lv_char"一些char值
   输入
     retcode = l_retcode

 ENDFORM。  " WRITE_TEXT_TO_DB

 表格doi_open_document
    使用ps_all_data_hdr TYPE zfm_res_add_data_msword2_src
           po_document类型参考i_oi_document_proxy。

   数据:l_docsize TYPE i。
   数据:ls_raw TYPE raw255。
   数据:raw255的lt_raw类型标准表。
   数据:ls_doc_tmpl类型为zfm_add_doc_tmpl。
   数据:zfm_add_doc_tmpl的lt_doc_tmpl类型标准表。
   数据:l_template_versi(2)类型c。
   数据:l_retcode类型soi_ret_string。

 " [....]从数据库读取模板的RAW到lt_raw和l_docsize

   呼叫方法po_document-> open_document_from_table
     出口
       document_size = l_docsize
       document_table = lt_raw
       no_flush =''
       open_inplace ='X'
     输入
        retcode = l_retcode。
 ENDFORM。
 

(10.8 kB)

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


大家好!


经过非常深入的搜索,我到达了墙,无法再进一步移动:(

我知道有关如何初始化DOI的编码过程。 然后,如何为模板中的链接添加映射,如何在RAW数据中加载模板并使用更改后的值打开文档。 但是..

问题:如何准备这样的WORD文档模板? 文档非常复杂,我已经有了局部语言,但是没有变量(SAP OLE链接,SAP Demo模板的MS WORD附带的屏幕)。 因此,最好的选择是在特定位置输入局部语言,然后上传模板并将其另存为ITAB到SAP DB表中的RAW。

SAP演示模板此处

如果有人要寻找有关如何使用RAW模板的过程,请在其中更改变量并在此处打开doc(缩短版本):

 FORM doi_initialize
    使用p_cust_cont_name
    将po_control类型参考更改为i_oi_container_control
             po_document类型参考i_oi_document_proxy
             po_link_server类型参考i_oi_link_server
            po_gui_cust_container类型参考cl_gui_custom_container。

 数据:l_retcode类型soi_ret_string。

     创建对象po_gui_cust_container
       出口
         container_name = p_cust_cont_name。

     调用方法c_oi_container_control_creator => get_container_control
       输入
         控制= po_control
         retcode = l_retcode。

     调用方法po_control-> init_control
       出口
         r3_application_name ='文件导出'(010)
         inplace_enabled ='X'
         父母= po_gui_cust_container
       输入
         retcode = l_retcode。

   调用方法po_control-> get_document_proxy
     出口
       document_type = soi_doctype_word_document"'Word.Document'
       document_format = soi_docformat_compound"'OLE'
     输入
       document_proxy = po_document
       retcode = l_retcode。

   调用方法po_control-> get_link_server
     输入
       link_server = po_link_server
       retcode = l_retcode。
 
  调用方法po_link_server-> start_link_server [...]
 ENDFORM。  " DOI_INITIALIZE


 FORM export_values2word
    使用p_blart
           po_link_server类型参考i_oi_link_server
           ps_flds_value类型zfm_res_add_data_mswordole_trg。

   数据:l_retcode类型soi_ret_string。
 ************** WORD中的变量1

   呼叫方法po_link_server-> add_string_item
   出口
     item_name ='Z_var1'
     item_value = lv_char"一些char值
   输入
     retcode = l_retcode

 ENDFORM。  " WRITE_TEXT_TO_DB

 表格doi_open_document
    使用ps_all_data_hdr TYPE zfm_res_add_data_msword2_src
           po_document类型参考i_oi_document_proxy。

   数据:l_docsize TYPE i。
   数据:ls_raw TYPE raw255。
   数据:raw255的lt_raw类型标准表。
   数据:ls_doc_tmpl类型为zfm_add_doc_tmpl。
   数据:zfm_add_doc_tmpl的lt_doc_tmpl类型标准表。
   数据:l_template_versi(2)类型c。
   数据:l_retcode类型soi_ret_string。

 " [....]从数据库读取模板的RAW到lt_raw和l_docsize

   呼叫方法po_document-> open_document_from_table
     出口
       document_size = l_docsize
       document_table = lt_raw
       no_flush =''
       open_inplace ='X'
     输入
        retcode = l_retcode。
 ENDFORM。
 

(10.8 kB)
付费偷看设置
发送
6条回答
Nir深蓝
1楼-- · 2020-08-25 13:33

因此,您缺少如何使用I_OI_WORD_PROCESSOR_DOCUMENT接口的方法。 如果将"占位符"文本(PH1,PH2,PH3或其他内容)放置在Word模板文档中所需的任何位置,则可以简单地使用REPLACE方法(SAP库中的文档)。 这是您缺少的代码+替换+检索最终文档:

 DATA interface_available TYPE i。
 调用方法po_document-> has_WORDPROCESSOR_interface
       输入
         is_available = interface_available。
 如果不是interface_available为INITIAL,则为INITIAL。
   DATA po_worddoc类型参考I_OI_WORD_PROCESSOR_DOCUMENT。
   调用方法po_document-> get_WORDPROCESSOR_interface
         输入
           wp_interface = po_worddoc。
   po_worddoc-> replace(search_string ='PH1'replace_string ='您想要的是pos ='global')。
   ...
   po_document-> save_document_to_table(更改document_size = docsize document_table = doctable)。
 
SAP小菜
2楼-- · 2020-08-25 13:38

正如我所说,可以避免"闪光"。 我认为Link Server在您的情况下是可选的:如果要将值存储在剪贴板中,则可以使用cl_gui_frontend_services => clipboard_export(和文档代理界面的paste_clipboard)。 我对换行的问题感到非常惊讶,希望我有时间可以做一些测试。

对于其他解决方案:您只能将DOCX与CL_ABAP_ZIP一起使用。 DOCX只是具有特殊文件结构的ZIP。 其中之一包含文本,您可以用自己的文本替换占位符。 或者,您可以使用旧格式XML2003。

樱桃小丸子0093
3楼-- · 2020-08-25 13:43

通过事务OAOR,您可以在BDS中加载Office文档(或任何文件)。 您可以使用CL_BDS_DOCUMENT_SET类以编程方式读取BDS文件,然后知道如何在DOI中加载它。

您不想使用DOI,而不必使用自定义XML部件以DOCX格式实现文档。 它已在SCN(类CL_DOCX_DOCUMENT)和Web(Microsoft Office中的自定义XML部件)中进行了讨论。 由于您已经在DOI上做了一些工作,因此可能会更长一些,但这是一种较新的技术(生成速度更快,并且可以在后台运行)。

Nir深蓝
4楼-- · 2020-08-25 13:28

非常感谢您的支持 回复!

我知道使用OAOR上传模板。 问题是我不知道如何在上传之前准备文档,因此如何添加连接到SAP OLE Link的变量,如所附的屏幕截图所示。

使用XML的想法当然可能是最好的选择,我在研究过程中发现了这个概念,但是在客户端的服务器上没有这样的类,也没有整个OpenXML类:(

Climb_Ma
5楼-- · 2020-08-25 13:32

嗨Michal,

"问题是我不知道如何在上传之前准备文档,因此如何添加连接到SAP OLE Link的变量,如所附的屏幕截图所示。"

您找到任何答案了吗?

Baoming ROSE
6楼-- · 2020-08-25 13:35

很久以前,我还不确定。 但是我发现了一些代码。 基本上,您需要创建没有任何SAP OLE链接的模板,并在内部表中准备映射。 然后使用程序将其打开。 在调试器中,您需要指出位置并继续粘贴链接。 可能有更好的方法,但这就是我的处理方式。

粘贴链接的示例代码。

我关于此主题的所有注释(代码)均为此处:)

将GT_MAP_OLE循环到LS_MAP_OLE中。
  呼叫方法po_link_server-> COPY_LINK_ITEM_TO_CLIPBOARD
   出口
     ITEM_NAME = LS_MAP_OLE-VAR
   输入
     retcode = l_retcode。
   呼叫方法c_oi_errors => show_message
     出口
       类型='E'。
 呼叫方法PO_DOCUMENT-> PASTE_SPECIAL
   输入
     retcode = l_retcode。
   呼叫方法c_oi_errors => show_message
     出口
       类型='E'。
 ENDLOOP。

一周热门 更多>