3

我正在尝试删除包含"{Some Text}". 下面的方法就是这样做的,但我注意到在删除段落后,还剩下空的段落元素。

如何以<w:p />编程方式删除元素?

以下是我最初用来删除段落的内容。

 using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(file, true))
        {
            MainDocumentPart mainPart = wordDoc.MainDocumentPart;
            Document D = mainPart.Document;

            foreach (Paragraph P in D.Descendants<Paragraph>())
            {
                if (P.InnerText.Contains("{SomeText}"))
                {
                    P.RemoveAllChildren();
                    //P.Remove();   //doesn't remove
                }
            }
            D.Save();
        }

这就是 document.xml 看起来像后记的样子:

<w:p />
<w:p />
<w:p />
<w:p />
<w:p />
<w:p />
<w:p />
4

2 回答 2

7

这里的问题:

        foreach (Paragraph P in D.Descendants<Paragraph>())
        {
            if (P.InnerText.Contains("{SomeText}"))
            {
                P.Remove();   //doesn't remove
            }
        }

是你在迭代它时试图从集合中删除一个项目。出于某种奇怪的原因,OpenXML SDK 实际上并没有在这里抛出异常,它只是默默地退出foreach循环。附加调试器并单步执行将向您展示这一点。修复很简单:

        foreach (Paragraph P in D.Descendants<Paragraph>().ToList())
        {
            if (P.InnerText.Contains("{SomeText}"))
            {
                P.Remove();   //will now remove
            }
        }

通过添加ToList(),您将段落复制(浅复制)到单独的列表并遍历该列表。现在,当您删除一个段落时,它会从D.Descendants<Paragraph>()集合中删除,但不会从您的列表中删除,并且迭代将继续。

于 2014-03-06T20:30:21.597 回答
0

上面的答案帮助我创建了以下代码片段,该代码片段从头到尾删除了段落(不包括开头和结尾)。当您必须使用模板作为输入但您不希望在输出中包含模板的某些部分时,这种方法非常方便。

public void RemoveParagraphsFromDocument(string begin, string end)
{
    using (var wordDoc = WordprocessingDocument.Open(OutputPath, true))
    {
        var mainPart = wordDoc.MainDocumentPart;
        var doc = mainPart.Document;
        var paragraphs = doc.Descendants<Paragraph>().ToList();
        var beginIndex = paragraphs.FindIndex(par => par.InnerText.Equals(begin));
        var endIndex = paragraphs.FindIndex(par => par.InnerText.Equals(end));

        for (var i = beginIndex + 1; i < endIndex; i++)
        {
            paragraphs[i].Remove();
        }

        doc.Save();
    }
}
于 2020-04-16T20:43:16.540 回答