在不丢失位置的情况下删除内容控制表单WordprocessingDocument

时间:2018-06-27 10:45:40

标签: c# ms-word openxml docx word-contentcontrol

我正在使用此代码(发布在link上)从Word文档中删除内容控件

 MainDocumentPart mainPart = _wordDocument.MainDocumentPart;
 List<SdtBlock> sdtList = mainPart.Document.Descendants<SdtBlock>).ToList();

  foreach (SdtBlock sdt in sdtList)
  {
    OpenXmlElement sdtc = sdt.GetFirstChild<SdtContentBlock>();
    OpenXmlElement parent = sdt.Parent;
    OpenXmlElementList elements = sdtc.ChildElements;  

    var mySdtc = new SdtContentBlock(sdtc.OuterXml);         
    foreach (OpenXmlElement elem in elements)
    {
       parent.Append((OpenXmlElement)elem.Clone());                   
    }       
    sdt.Remove();
  }

一切正常,但是删除操作之后的文本丢失了该操作之前的位置。我从openxmlpowertools知道SimplifyMarkup,但是我不能使用它。感谢任何建议

1 个答案:

答案 0 :(得分:1)

您正在从自己的脚下拉出地毯。

foreach (SdtBlock sdt in sdtList)
{
    sdt.Remove();
    // Now what?
}

在注释点(尽管实际上在括号中),sdt不存在,所以当您不知道自己在哪里时如何移动到下一个?

解决方案是向后工作,或列出并在最后删除它们。向后工作使用一个计数,当您删除该元素时该计数仍然存在,因此它仍可以迭代。

foreach (int i = sdtList.Count() -1; i > 0; i--)
{
    var sdt = sdtList[i];
    OpenXmlElement sdtc = sdt.GetFirstChild<SdtContentBlock>();
    OpenXmlElement parent = sdt.Parent;
    OpenXmlElementList elements = sdtc.ChildElements;  

    var mySdtc = new SdtContentBlock(sdtc.OuterXml);         
    foreach (OpenXmlElement elem in elements)
    {
        parent.Append((OpenXmlElement)elem.Clone());                   
    }       
    sdtList.Remove(sdtList[i]);
}