如何使用 Open XML SDK 从 Word 文档复制富文本内容控件的内容并删除控件本身

How to copy content of Rich Text Content Control from Word document and remove the control itself using Open XML SDK

我正在尝试将富文本内容控件的内容从一个 Word 文档复制到另一个 Word 文档。每个富文本内容控件都包含一个文本块和一些纯文本内容控件。下面的代码似乎有效...

using (WordprocessingDocument doc = WordprocessingDocument.Open(destinationFile, true))
{
    MainDocumentPart mainPart = doc.MainDocumentPart;
    Dictionary<string, SdtBlock> sdtBlocks = getContentControlsFromDocument(sourceFile);
    foreach (KeyValuePair<string, SdtBlock> sdtBlock in sdtBlocks)
    {
        SdtElement control = mainPart.Document.Body.Descendants<SdtElement>().Where(r =>
        {
            var tag = r.SdtProperties.GetFirstChild<Tag>();
            return tag != null && tag.Val == sdtBlock.Key.ToLower();
        }).FirstOrDefault();

        SdtContentBlock cloneSdtContentBlock = (SdtContentBlock)sdtBlock.Value.Descendants<SdtContentBlock>().FirstOrDefault().Clone();
        control.Parent.InsertAfter(cloneSdtContentBlock, control);
        control.Remove();
    }
    mainPart.Document.Save();
}

但是当我尝试使用下面的代码在 destinationFile 中找到所有内容控件时

string key = "tag_name";
List<SdtElement> controls = mainPart.Document.Body.Descendants<SdtElement>().Where(r =>
{
    var tag = r.SdtProperties.GetFirstChild<Tag>();
    return tag != null && tag.Val == key.ToLower();
}).ToList();

我在从 sourceFile 复制的富文本内容控件中找不到 were/are 的内容。换句话说,我只想复制富文本内容控件的内容,而不复制控件本身。

更新:

为了简化问题。我有一个富文本内容控件,它可能包含纯文本和几个纯文本内容控件。我只需要复制(仅)此富文本内容控件中的内容,它将整个内容包装到另一个 Word 文档中。

在此期间,我设法自己解决了问题。这是解决方案,因此它可能对其他人有用。

using (WordprocessingDocument doc = WordprocessingDocument.Open(@"C:\tmp\test-1.docx", true))
    {
        MainDocumentPart mainPart = doc.MainDocumentPart;
        foreach (var conditialTemplate in conditionalTemplates)
        {
            List<SdtElement> controls = mainPart.Document.Body.Descendants<SdtElement>().Where(r =>
            {
                var tag = r.SdtProperties.GetFirstChild<Tag>();
                return tag != null && tag.Val == conditialTemplate.ToLower();
            }).ToList();
    
            foreach (var control in controls)
            {
                if (control != null)
                {
                    SdtProperties props = control.Elements<SdtProperties>().FirstOrDefault();
                    Tag tag = props.Elements<Tag>().FirstOrDefault();
                    Console.WriteLine("Tag: " + tag.Val);
    
                    string theRightBlock = "A";
    
                    SdtBlock theRightSdtBlock = GetTheRightConditionalSdtBlock(theRightBlock, tag.Val);
                    if (theRightSdtBlock != null)
                    {    
                        OpenXmlElement parent = control.Parent;
                        SdtBlock clone = new SdtBlock();
                        clone = (SdtBlock)theRightSdtBlock.Clone();
                        var elements = clone.GetFirstChild<SdtContentBlock>().ChildElements.ToList();
                        elements.Reverse();
                        elements.ForEach(child =>
                        {
                            parent.InsertAfter(child.Clone() as OpenXmlElement, control);
                        });
                        control.Remove();
                    }
                }
            }
        }
        mainPart.Document.Save();
    }