具有重复部分内容控件和文本内容控件的 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();
}
最后我自己找到了一个解决方案,使用 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);
}
}