【问题标题】:Remove Content Control form WordprocessingDocument without losing place删除内容控制表单 WordprocessingDocument 而不会丢失位置
【发布时间】:2018-06-27 10:45:39
【问题描述】:

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

 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,但我不能使用它。感谢您的任何建议

【问题讨论】:

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


    【解决方案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]);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-20
      相关资源
      最近更新 更多