【问题标题】:What is the correct way to inject some paragraphs with rich text in a Word content control?在 Word 内容控件中注入带有富文本的某些段落的正确方法是什么?
【发布时间】:2017-12-07 06:19:37
【问题描述】:

我正在尝试使用 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 元素的用途和层次结构?

【问题讨论】:

    标签: ms-word openxml-sdk


    【解决方案1】:

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

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

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

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

    然后,我将您的代码替换为以下内容:

            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();
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多