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

Posted

技术标签:

【中文标题】如何从 Word 文档中复制富文本内容控件的内容并使用 Open XML SDK 删除控件本身【英文标题】:How to copy content of Rich Text Content Control from Word document and remove the control itself using Open XML SDK 【发布时间】:2021-04-27 16:58:08 【问题描述】:

我正在尝试将富文本内容控件的内容从一个复制到另一个 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 复制的富文本内容控件中的内容。换句话说,我只想复制富文本内容控件的内容,而不复制控件本身。

更新:

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

【问题讨论】:

【参考方案1】:

与此同时,我自己设法解决了这个问题。这是解决方案,因此可能对其他人有用。

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

【讨论】:

以上是关于如何从 Word 文档中复制富文本内容控件的内容并使用 Open XML SDK 删除控件本身的主要内容,如果未能解决你的问题,请参考以下文章

如何用纯文本内容控件替换富文本内容控件

如何从word文档复制公式到fckeditor编辑器

百度ueditor新增的将word内容导入到富文本编辑框的功能怎么没有啊,或者谁知道该如何操作

从word中复制内容包含图片到Web编辑器中

kindeditor富文本编辑器支持从word复制粘贴保留格式和图片的插件

如何将word图片复制到富文本编辑器里面