如何 'Tag' Word 文档的区域以便使用 Open Office XML 轻松地向其中添加文本?
How to 'Tag' regions of a Word Documents to make it easy to add text to them with Open Office XML?
我的应用程序需要为用户创建格式丰富的 Word 文档。该过程从两个文档开始:
- Word 文档模板。
- 用作段落“数据库”的 Word 文档,可根据用户输入将其添加到模板文档中。
根据用户输入,所选段落将被复制到 Word 模板中,创建最终的 Word 文档。
我认为需求是:
- 创建包含 'tagged' 个区域的 Word 模板。比如,模板中的某种标签作为用户选择的第一段的目标。
- 用于在 Word 模板中查找 'tags' 并替换为 'database' word 文档中的格式化文本的代码。
谁能建议如何 'tag' Word 模板的区域,然后可以通过编程轻松找到这些区域?
谢谢,
马特
一种方法是在 Word 模板中使用合并字段。它们很容易添加,并允许您通过 OpenXML sdk 以编程方式操作它们。
您可以为此目的使用内容控件。内容控件有一个 Tag 属性,您可以将其设置为唯一,然后可以使用该 Tag 值以编程方式访问它。 Here 是可以帮助您入门的 link。
标记文档区域
"tag" 文档区域的最简洁方法是使用内容控件。
如果您使用 块级 "rich text" 内容控件,那么它可以包含块级内容,例如段落和表格,以及嵌套内容控件。
这是富文本内容控件的一个简单示例(设置了一些有用的属性)。
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" >
<w:body>
<w:p>
<w:r>
<w:t>An ordinary top level p</w:t>
</w:r>
</w:p>
<w:sdt>
<w:sdtPr>
<w:alias w:val="my title"/>
<w:tag w:val="my tag"/>
<w:id w:val="1508253281"/>
<w:lock w:val="sdtLocked"/>
</w:sdtPr>
<w:sdtContent>
<w:p >
<w:r>
<w:t>This is a paragraph in a rich text content control.</w:t>
</w:r>
</w:p>
<w:p >
<w:r>
<w:t>Another paragraph </w:t>
</w:r>
</w:p>
<w:tbl>
<!-- table content -->
</w:tbl>
</w:sdtContent>
</w:sdt>
</w:body>
</w:document>
因为内容控件的内容位于其 sdtContent 元素内,所以从 XML 的角度来看,这些内容很容易操作。 (比较书签,例如,有书签开始和结束点标签,它们可以有不同的父元素!)
一旦您决定将内容控制作为您的需求 #1 的解决方案,您就可以根据您的需求 #2 做出选择
用格式化文本替换内容控件内容
插入任意内容有点复杂,因为您必须处理与其他部分的关系。我建议您使用代码来合并 docx 文件:请参阅 Merge multiple word documents into one Open Xml(文档生成器方法比 altChunk 更强大,因为 altChunk 需要在支持 altChunk 的处理器(例如 Word 或 Plutext 的处理器)中打开文档以进行转换altChunk 到正常的 docx 内容)
或者,如果您可以假设 docx 将在 Word 2013 中打开,您可以使用 w15 richtext 数据绑定。您将格式化的内容放入自定义 XML 部分(如 Flat OPC XML),Word 将自动使用该内容更新文档。
要开始使用,请考虑以下示例 XML:
样本XML
<myxml>
<someelement>blagh</someelement>
<yourdb>
<content1>FLAT-OPC</content1>
</yourdb>
</myxml>
将它上传到 this service I wrote, and, as described in this blog post,它会给你一个包含带有 w15:dataBinding.
的内容控件的 docx 返回
结果内容控制
<w:sdt>
<w:sdtPr>
<w15:dataBinding w:prefixMappings="" w:xpath="/myxml[1]/yourdb[1]/content1[1]" w:storeItemID="{115f7b60-1982-4ec7-afc5-28d28886db4b}"/>
<w:richText/>
</w:sdtPr>
<w:sdtContent>
<w:p>
<w:r>
<w:t>Rich Word content can go here</w:t>
</w:r>
</w:p>
</w:sdtContent>
</w:sdt>
在 Word 2013 中编辑内容后,检查自定义 XML 部分:
自定义XML部分内容
<myxml>
<someelement>blagh</someelement>
<yourdb>
<content1>
<?xml version="1.0" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage"><pkg:part pkg:name="/_rels/.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="512"><pkg:xmlData>...</pkg:xmlData></pkg:part></pkg:package>
</content1>
</yourdb>
</myxml>
您可以看到该元素现在包含 转义平面 OPC XML。
它的美妙之处在于:
- 该内容是独立的;它具有渲染所需的一切(即所有样式、关系等)
- 绑定是双向的。用户在 Word 2013 中打开文档时将看到您的数据库内容,如果允许他们编辑该内容,他们所做的更改将反映在自定义 XML 部分(因此您可以轻松保存修改后的内容内容到数据库,如果你愿意的话)
我的应用程序需要为用户创建格式丰富的 Word 文档。该过程从两个文档开始:
- Word 文档模板。
- 用作段落“数据库”的 Word 文档,可根据用户输入将其添加到模板文档中。
根据用户输入,所选段落将被复制到 Word 模板中,创建最终的 Word 文档。
我认为需求是:
- 创建包含 'tagged' 个区域的 Word 模板。比如,模板中的某种标签作为用户选择的第一段的目标。
- 用于在 Word 模板中查找 'tags' 并替换为 'database' word 文档中的格式化文本的代码。
谁能建议如何 'tag' Word 模板的区域,然后可以通过编程轻松找到这些区域?
谢谢, 马特
一种方法是在 Word 模板中使用合并字段。它们很容易添加,并允许您通过 OpenXML sdk 以编程方式操作它们。
您可以为此目的使用内容控件。内容控件有一个 Tag 属性,您可以将其设置为唯一,然后可以使用该 Tag 值以编程方式访问它。 Here 是可以帮助您入门的 link。
标记文档区域
"tag" 文档区域的最简洁方法是使用内容控件。
如果您使用 块级 "rich text" 内容控件,那么它可以包含块级内容,例如段落和表格,以及嵌套内容控件。
这是富文本内容控件的一个简单示例(设置了一些有用的属性)。
<w:document xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" >
<w:body>
<w:p>
<w:r>
<w:t>An ordinary top level p</w:t>
</w:r>
</w:p>
<w:sdt>
<w:sdtPr>
<w:alias w:val="my title"/>
<w:tag w:val="my tag"/>
<w:id w:val="1508253281"/>
<w:lock w:val="sdtLocked"/>
</w:sdtPr>
<w:sdtContent>
<w:p >
<w:r>
<w:t>This is a paragraph in a rich text content control.</w:t>
</w:r>
</w:p>
<w:p >
<w:r>
<w:t>Another paragraph </w:t>
</w:r>
</w:p>
<w:tbl>
<!-- table content -->
</w:tbl>
</w:sdtContent>
</w:sdt>
</w:body>
</w:document>
因为内容控件的内容位于其 sdtContent 元素内,所以从 XML 的角度来看,这些内容很容易操作。 (比较书签,例如,有书签开始和结束点标签,它们可以有不同的父元素!)
一旦您决定将内容控制作为您的需求 #1 的解决方案,您就可以根据您的需求 #2 做出选择
用格式化文本替换内容控件内容
插入任意内容有点复杂,因为您必须处理与其他部分的关系。我建议您使用代码来合并 docx 文件:请参阅 Merge multiple word documents into one Open Xml(文档生成器方法比 altChunk 更强大,因为 altChunk 需要在支持 altChunk 的处理器(例如 Word 或 Plutext 的处理器)中打开文档以进行转换altChunk 到正常的 docx 内容)
或者,如果您可以假设 docx 将在 Word 2013 中打开,您可以使用 w15 richtext 数据绑定。您将格式化的内容放入自定义 XML 部分(如 Flat OPC XML),Word 将自动使用该内容更新文档。
要开始使用,请考虑以下示例 XML:
样本XML
<myxml>
<someelement>blagh</someelement>
<yourdb>
<content1>FLAT-OPC</content1>
</yourdb>
</myxml>
将它上传到 this service I wrote, and, as described in this blog post,它会给你一个包含带有 w15:dataBinding.
的内容控件的 docx 返回结果内容控制
<w:sdt>
<w:sdtPr>
<w15:dataBinding w:prefixMappings="" w:xpath="/myxml[1]/yourdb[1]/content1[1]" w:storeItemID="{115f7b60-1982-4ec7-afc5-28d28886db4b}"/>
<w:richText/>
</w:sdtPr>
<w:sdtContent>
<w:p>
<w:r>
<w:t>Rich Word content can go here</w:t>
</w:r>
</w:p>
</w:sdtContent>
</w:sdt>
在 Word 2013 中编辑内容后,检查自定义 XML 部分:
自定义XML部分内容
<myxml>
<someelement>blagh</someelement>
<yourdb>
<content1>
<?xml version="1.0" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage"><pkg:part pkg:name="/_rels/.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="512"><pkg:xmlData>...</pkg:xmlData></pkg:part></pkg:package>
</content1>
</yourdb>
</myxml>
您可以看到该元素现在包含 转义平面 OPC XML。
它的美妙之处在于:
- 该内容是独立的;它具有渲染所需的一切(即所有样式、关系等)
- 绑定是双向的。用户在 Word 2013 中打开文档时将看到您的数据库内容,如果允许他们编辑该内容,他们所做的更改将反映在自定义 XML 部分(因此您可以轻松保存修改后的内容内容到数据库,如果你愿意的话)