在Word内容控件中使用富文本注入一些段落的正确方法是什么?

时间:2017-08-29 13:32:44

标签: ms-word openxml-sdk

我正在尝试使用Open Xml SDK在Word内容控件中注入一些段落。

我的代码似乎有效(段落在word文件中可见)。但是,无法编辑控件。我只能在插入新内容之前删除整个内容。

如何模仿手动复制/粘贴到内容控件中?

仅供参考,这是我的代码:

var mainPart = package.MainDocumentPart;

var sdtRuns = mainPart.Document.Descendants<SdtElement>().Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == "TagOfMyContentControl");

foreach (var sdtBlock in sdtRuns)
{
    List<Paragraphs> paragraphs = GetParapraphsFromSomewhere();
    var contentControlParagraph = sdtBlock.Descendants<SdtContentBlock>().First();
    contentControlParagraph.RemoveAllChildren();
    contentControlParagraph.Append(paragraphs);
}

mainPart.Document.Save();

PS:我是一种更通用的方式,是否有任何资源可以解释Word ML元素的用途和层次结构?

1 个答案:

答案 0 :(得分:1)

您的代码接近于将模仿副本粘贴到内容控件中。以下两行是删除内容控件中所有段落的行:

var contentControlParagraph = sdtBlock.Descendants<SdtContentBlock>().First();
contentControlParagraph.RemoveAllChildren();

相反,您需要确定要放置段落的位置,并Append将其放在那里。

例如,我有一个带有名为CopyPasteCC的富文本内容控件的docx。此图像以开发人员模式显示doc。内容控件有3个现有段落。

enter image description here

然后,我用以下代码替换你的代码:

        var mainPart = document.MainDocumentPart;

        var sdtRuns = mainPart.Document.Descendants<SdtElement>().Where(run => run.SdtProperties.GetFirstChild<Tag>().Val.Value == "CopyPasteCC");

        sdtRuns.ElementAt(0).Descendants<Paragraph>().ElementAt(1).InsertAfterSelf(
            new Paragraph(new Run(new Text("Hello - this is new Copy Paste paragraph")))
            );

        mainPart.Document.Save();

第三行选择第二行中找到的内容控件中的所有段落。然后它在第二个现有段落之后插入一个新段落。运行此代码后,以下图片是上述文件:

enter image description here

要回答您的 PS 问题,您可以尝试阅读正式的OpenXML Specification。这不容易阅读,但它是权威的规范。有一个更通用(但过时)的免费电子书名为OpenXml Explained

我每个月都会参考一次这些信息。 OpenXml Explained的第一章涵盖WordprocessingML,第39页有一个结构化文档标签部分,其中概述了内容控件。