使用C#从Word文档中删除重复的节控件和文本内容控件

问题描述 投票:0回答:1

具有重复部分内容控件和文本内容控件的 Word 文档会动态填充内容。创建文档后,需要删除所有控件以使文档更易于编辑(应保留内容)。 我已经为代码创建了一个基本框架,如何扩展它以便仅删除控件并保留内容?

using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;

using (WordprocessingDocument doc = WordprocessingDocument.Open(@"C:\Temp\Test\Weekly Marketing Dashboard.docx", true))
{

    MainDocumentPart mainPart = doc.MainDocumentPart;

    var sdtElements = mainPart.Document.Descendants<SdtElement>().ToList();

    foreach (var sdtElement in sdtElements)
    {
        sdtElement.Remove();
    }

    mainPart.Document.Save();
}
c# ms-word openxml-sdk word-contentcontrol wordprocessingml
1个回答
0
投票

最后我自己找到了一个解决方案,使用 OpenXML:

    static void RemoveContentControls(OpenXmlElement element)
{
    // Replace SdtCells
    var sdtCells = element.Descendants<SdtCell>().ToList();
    foreach (var sdtCell in sdtCells)
    {
        // Clone and paste each child element
        foreach (OpenXmlElement child in sdtCell.SdtContentCell.ChildElements)
        {
            sdtCell.InsertBeforeSelf(child.CloneNode(true));
        }
        sdtCell.Remove();
    }

    // Replace SdtRuns
    var sdtRuns = element.Descendants<SdtRun>().ToList();
    foreach (var sdtRun in sdtRuns)
    {
        // Clone and paste each child element
        foreach (OpenXmlElement child in sdtRun.SdtContentRun.ChildElements)
        {
            sdtRun.InsertBeforeSelf(child.CloneNode(true));
        }
        sdtRun.Remove();
    }

    // Process childs recursive
    foreach (var child in element.ChildElements.ToArray()) // Use ToArray for save modification during iteration
    {
        RemoveContentControls(child);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.