`
JerryWang_SAP
  • 浏览: 1030392 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

word模板和XML数据源是如何合并生成最后的word文档的详细过程

阅读更多

This document is used for consultant or developers at customer side who would like to know technical detail about how a word template is merged with xml data stream. Before you touch the related ABAP code about document merging, it is good to get some basic understandong about how ABAP manipulates word document in this document Manipulate Docx document with ABAP.

In the document Create Webservice enabled word document in attachment assignment block, it is described how to create a word template and feed its content with web service generated via web service tool in CRM Webclient UI. Besides that you could also use your own web service, for example you can expose your function module in ABAP backend via SOAMANAGER. The detailed step could be found in this document.

In consulting note 2048272, an ABAP report is provided to allow you to merge the word template with given xml data without Webclient UI:

 

 

If you meet with issue that the merged word document does not work as you expected, for example some fields are empty however the corresponding node in xml do have data filled, then you can use this ABAP report to do trouble shooting. You could get the word template and xml data file for web service response by following consulting note 2047259.

In this document, I will show you how the element “Partner” in word template is merged with the value from xml node SOLD_TO.PARTNER in the runtime. You could find the template “zpartner.docx” and xml data file “response.xml” used in this example from document attachment.

 

 

Explore the word template to identify binding information

From the above screenshot, we click on Partner field and the tooltip shows this element is bound to field PARTNER. How is this mapping relationship maintained within word template?

Rename zparetner.docx to zpartner.zip, double click on the zip file, double click subfolder “word”, then double click on “document.xml”: You should find a w:t node with PARTNER, and a w:tag node with attribute “w:val”, whose value is 0050569457471ED488F2038D1D8360BE. The w:t node contains the text which end user sees in the word template, and w:val maintains the mapping relationship to xml schema.

 

 

Now go back to zpartner.zip, click on customXml folder and double click “item1.xml”. Search xml file by value “0050569457471ED488F2038D1D8360BE”. One result found, and we could know the complete binding path is Z_JENS_GET_MORE_COMPLEXResponse.ES_C5064266.SOLD_TO.PARTNER.

 

 

Merge step1 cl_crm_oi_docx_helper=>replace_vars_uuid_with_path

In this step, the original uuid in document.xml is replaced by the complete path of bound xml node:

 

 

Merge step2 add necessary namespace to every node in xml

It is done via transformation call:

CALL TRANSFORMATION crm_office_int_rt_add_ns
        SOURCE XML lv_response
        RESULT XML lv_response_ns.

Notice the no namespace added for each node after transformation call:

 

 

Merge step3 cl_crm_oi_docx_transform_rt=>transform

the formatted template source( uuid replaced with complete path ) and formatted xml data source( n0 namespace added ) are passed into this method.

step3.1 cl_crm_oi_docx_transform_rt=>indicate_tree

The xml node is further enriched with attribute Loopcount and Path, which are especially used for render data with table structure. ( template merged with table data will be discussed in another document )

 

 

step3.2 cl_crm_oi_docx_transform_rt=>update_payload_from_addinsch

This method will create a new attribute sapvartype with value “T” for those node in xml source with table structure, not relevant for current example.

 

 

step3.3 recursively call cl_crm_oi_docx_transform_rt=>process_node_cc

node: dom element of root node “Z_JENS_GET_MORE_COMPLEXResponse” in xml.

 

 

Now we have reached the first leaf node in xml, “CLIENT”. Pay attention to the recursive callstack.

 

 

since we don’t bind CLIENT node in xml to our template, after method get_contentcontrol_node_bypath, lt_node_ref_word will remain empty so we quit from the current traverse and try with next node.

 

 

Soon we reach the method get_contentcontrol_node_bypath again, and since our template consumes the node PARTNER, it is ready to feed the template with the value contained in this xml node.

 

 

The sold to partner id “0000419333” will be set to the corresponding dom element node “lr_node_word” by the method below.

 

 

in the beginning of this document we know it is the content of w:t node which will be displayed to end user so first we have to locate those w:t nodes via filtering ( w:t node found and stored in variable node_text ) and finally fill value to them by method fill_text_node, and that’s all.

 

 

final merged document:

 

 

And you could find the w:t node contains the correct value from document source code:

 

 

Next reading

Understand how the word template is merged with xml data stream – part 2 – table structure

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

0
1
分享到:
评论

相关推荐

    java XML解析方式实现自动生成word文档

    在提供的案例代码中,可能包含了上述步骤的实现,例如`wordTest`文件可能是一个示例程序,演示了如何将XML数据与Word模板结合。而`导出word文档.docx`可能是一个生成的Word文档实例,展示了XML解析后的结果。 通过...

    Access VBA套打Word 模板(三中方法)

    首先,我们需要将Word模板转换为XML格式,然后在Access中创建XML数据源。接下来,使用VBA将Access数据导出为XML文件,再将XML文件与Word模板进行数据绑定。这样,Word模板就能根据XML数据动态更新内容。这种方法适合...

    java根据模版生成带图片的word文档

    在我们的案例中,我们可以创建一个Word文档的.xml模板,然后使用Freemarker的语法插入动态数据和图片。 在Freemarker模板中,我们可以使用类似于`${expression}`的语法来插入变量,其中`expression`是你想要插入的...

    根据WORD文档模板书签绑定数据自动生成WORD文件下载打印

    标题和描述提到的是利用Word文档模板、书签和数据绑定来自动生成可下载打印的Word文件。这个过程涉及到的技术主要包括Microsoft Word的VBA(Visual Basic for Applications)编程、XML数据集成以及自动化脚本编写。...

    POI使用word模板文件循环输出行并导出word

    在这个例子中,我们将探讨如何使用POI库来处理Word文档,特别是利用模板文件循环输出表格行并导出新的Word文档。这个过程在数据分析、报告生成或自动化文档制作等场景中非常有用。 首先,我们需要理解Word文档的...

    java代码实现填充word模板生成word合同的实例

    这些值可以来自数据库、配置文件或其他数据源。 4. **保存生成的Word文件**:使用`XWPFDocument`的`write()`方法将修改后的文档写入新的Word文件中。 5. **转换为PDF**:生成Word文件后,可能还需要将其转换为PDF...

    Java Poi流 根据Word模板插入相应的文本、表格和图片,生成新的Word报告

    在本主题中,我们将深入探讨如何使用Java POI流处理Word模板,插入文本、表格和图片,以及生成新的Word报告。 1. **Java POI流处理Word模板**: - POI API提供了`XWPFDocument`类来处理`.docx`文件,这是Word 2007...

    Aspose.Words for NET根据word模板创建文档Demo源码

    在“Aspose.Words for .NET根据word模板创建文档Demo源码”中,我们可以通过分析源代码来学习如何利用Aspose.Words的功能根据模板文件生成新的Word文档。 1. **模板文件的理解与使用** 模板文件通常是一个预先设计...

    XML Publisher报表模板rtf文件

    XML Publisher是Oracle提供的一款强大的报表和文档生成工具,它能够帮助用户从各种数据源(如数据库、XML文件等)创建专业级别的报告。在本话题中,我们主要关注的是"XML Publisher报表模板rtf文件",这是一个关键...

    POI-TL合并多个Word文档

    总结起来,"POI-TL合并多个Word文档"涉及到的关键技术有Apache POI的XWPF组件用于读写.docx文件,以及POI-TL库提供的模板处理功能,使得在Java程序中高效地合并和生成Word文档成为可能。这在处理批量报告、合同生成...

    xml模板导word.rar

    XML模板导入Word是一种高效的数据驱动文档生成方法,它利用XML数据和Word模板来批量生成结构化文档。在IT行业中,这种技术广泛应用于自动化报告、合同生成、数据分析等领域,能够极大地提高工作效率并减少人为错误。...

    java生成word模板详解

    在生成Word模板的过程中,首先,你需要创建一个Word文档作为模板,其中包含固定的文本、占位符和格式。占位符可以是特殊的字符串或者特定的标签,它们会在运行时被动态数据替换。例如,你可以在模板中设定一个"{name...

    asp.net中根据word模板生成Word和PDF文件

    总之,在ASP.NET中根据Word模板生成Word和PDF文件是一个涉及多方面技术的过程,包括Word的Interop接口使用、字符串处理技巧以及PDF转换策略。理解并掌握这些知识点,能够帮助开发者更高效地实现文档自动化生成。在...

    (改进版本)利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码

    在这个"(改进版本)利用poi读取word模板文件,并回填逻辑数据,生成并导出需要的word文档源码"项目中,我们将深入探讨如何使用POI来处理Word文档。 首先,Apache POI提供了HWPF(Horizontally-Writeable & Portable ...

    Java freemarker 模板生成word动态表格

    源代码中会有一个Java类负责处理数据模型,加载模板,以及生成Word文档。而模板文件(.ftl)则位于`src/main/resources`目录下,其中定义了Word文档的结构和样式。 9. **实际应用**:这种技术常用于报告自动化、...

    使用freemarker生成word文档,源代码+jar包+说明文档及注意事项

    使用freemarker生成word ,并集成struts2 同时生成及下载文档 资料附有Java源代码和自己总结的使用说明及注意事项 大至预览如下: 1、用word编辑好模板 普通字符串替换为 ${string} 表格循环用标签 姓名:${...

    freemarker.jar freemarker架包 freemarker生成excel、word、html、xml简单例子

    2. **生成Word**:类似生成Excel,Freemarker同样支持生成Word文档。开发者需要定义一个包含Word文档结构和占位符的模板,然后将Java对象的数据填充到这些占位符中,通过Freemarker的API生成最终的.doc或.docx文件。...

    c#根据word模板生成word文档

    本主题聚焦于如何利用C#来根据Word模板生成Word文档,这在自动化报告生成、批量文档处理等场景中非常实用。下面将详细介绍这个过程,并涉及到相关的技术点。 首先,我们需要一个基础的Word模板,这个模板包含了我们...

Global site tag (gtag.js) - Google Analytics