从 WordprocessingDocument 中删除内容控件而不丢失位置
Remove Content Control form WordprocessingDocument without losing place
我正在使用此代码从 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 但我不能使用它。感谢任何建议
你是在自欺欺人。
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]);
}
我正在使用此代码从 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 但我不能使用它。感谢任何建议
你是在自欺欺人。
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]);
}