C# 如何';标签';Word文档的区域,以便于使用Open Office XML向文档中添加文本?

C# 如何';标签';Word文档的区域,以便于使用Open Office XML向文档中添加文本?,c#,ms-word,openxml,C#,Ms Word,Openxml,我的应用程序需要为用户创建一个格式丰富的Word文档。该过程从两个文档开始: Word文档模板 作为段落“数据库”的Word文档,可根据用户输入添加到模板文档中 根据用户输入,选定的段落将复制到Word模板中,从而创建最终的Word文档 我认为需要: 创建带有“标记”区域的单词模板。比方说,模板中的某种标记用作用户选择的第一段的目标 用于在Word模板中查找“标记”并替换为“数据库”Word文档中的格式化文本的代码 有谁能建议如何“标记”Word模板的区域,然后通过编程轻松找到这些区域吗 谢谢,

我的应用程序需要为用户创建一个格式丰富的Word文档。该过程从两个文档开始:

  • Word文档模板
  • 作为段落“数据库”的Word文档,可根据用户输入添加到模板文档中
  • 根据用户输入,选定的段落将复制到Word模板中,从而创建最终的Word文档

    我认为需要:

  • 创建带有“标记”区域的单词模板。比方说,模板中的某种标记用作用户选择的第一段的目标
  • 用于在Word模板中查找“标记”并替换为“数据库”Word文档中的格式化文本的代码
  • 有谁能建议如何“标记”Word模板的区域,然后通过编程轻松找到这些区域吗

    谢谢,
    Matt

    一种方法是在Word模板中使用合并字段。它们很容易添加,并允许您通过OpenXMLSDK以编程方式操作它们


    为此,您可以使用内容控件。内容控件有一个标记属性,您可以将该属性设置为唯一的,然后可以使用该标记值以编程方式访问该属性。是可以让您开始的链接。

    标记文档区域

    “标记”文档区域的最简单方法是使用内容控件

    如果使用块级“富文本”内容控件,则它可以包含块级内容,如段落和表格,以及嵌套的内容控件

    下面是一个富文本内容控件的简单示例(设置了一些有用的属性)

    
    一个普通的顶级p
    这是富文本内容控件中的段落。
    另一段
    
    因为内容控件的内容在其sdtContent元素中,所以从XML的角度来看,这些内容很容易操作。(例如,比较具有书签开始和结束点标记的书签,它们可能具有不同的父元素!)

    一旦您确定内容控制是您的需求解决方案#1,您就可以根据您的需求作出选择#2

    用格式化文本替换内容控件内容

    <myxml>
      <someelement>blagh</someelement>
      <yourdb>
        <content1>
          &lt;?xml version="1.0" standalone="yes"?&gt;
          &lt;?mso-application progid="Word.Document"?&gt;
          &lt;pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage"&gt;&lt;pkg:part pkg:name="/_rels/.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="512"&gt;&lt;pkg:xmlData&gt;...&lt;/pkg:xmlData&gt;&lt;/pkg:part&gt;&lt;/pkg:package&gt;
        </content1>
      </yourdb>
    </myxml>
    
    插入任意内容有点复杂,因为您必须处理与其他部分的关系。我建议您使用代码合并docx文件:请参阅(文档生成器方法比altChunk更健壮,因为altChunk要求在altChunk感知处理器(例如Word或Plutext)中打开文档,以将altChunk转换为普通docx内容)

    或者,如果您可以假设docx将在Word 2013中打开,则可以使用w15 richtext数据绑定。您将格式化的内容放入自定义XML部分(作为平面OPC XML),Word将自动使用该内容更新文档

    开始时,请考虑下面的示例XML:

    示例XML

    <myxml>
      <someelement>blagh</someelement>
      <yourdb>
        <content1>FLAT-OPC</content1>
      </yourdb>
    </myxml>
    
    
    废话
    平面OPC
    
    上传到,它会给你一个docx,包含一个带有w15:dataBinding的内容控件

    结果内容控制

    <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>
          &lt;?xml version="1.0" standalone="yes"?&gt;
          &lt;?mso-application progid="Word.Document"?&gt;
          &lt;pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage"&gt;&lt;pkg:part pkg:name="/_rels/.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="512"&gt;&lt;pkg:xmlData&gt;...&lt;/pkg:xmlData&gt;&lt;/pkg:part&gt;&lt;/pkg:package&gt;
        </content1>
      </yourdb>
    </myxml>
    
    
    废话
    ?xml version=“1.0”standalone=“是”?
    ?mso应用程序progid=“Word.Document”?
    包装:包装xmlns:pkg=”http://schemas.microsoft.com/office/2006/xmlPackage“pkg:part pkg:name=“/_rels/.rels”pkg:contentType=“application/vnd.openxmlformats package.relations+xml”pkg:padding=“512”pkg:xmlData…/pkg:xmlData/pkg:part/pkg:package
    
    您可以看到元素现在包含XML

    其美妙之处在于:

  • 该内容是独立的;它具有渲染所需的一切(即所有样式、关系等)
  • 绑定是双向的。用户在Word 2013中打开文档时将看到您的数据库内容,如果允许他们编辑该内容,他们所做的更改将反映在自定义XML部分中(因此,如果愿意,您可以轻松地将修改后的内容保存到数据库中)

  • 使用富文本内容控件,毫无疑问,通常使用合并字段将短语插入段落,而不是插入一个或多个块级项目(例如段落、表格)。此外,自2007年以来,数据绑定文本内容控件是达到相同目的的更现代的方式。@JasonPlutext我同意您的方式更好。我将保留合并字段注释,以防它对其他人有所帮助。