如何使用OOXML在WordProcessingML中删除TableRow?

问题描述 投票:0回答:1

我有一个非常简单的文档,其中只有一个表,表中有一些空白行,我正在尝试删除所有行。 (目的是最终实际上只删除空白行,但我根本没有删除任何行的运气。)

public static void SearchAndReplace(string document)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(document, true))
            {
               var body = doc.MainDocumentPart.Document.Body;
                foreach (var table in body.Elements<Table>())
                {
                    foreach (var row in table.Elements<TableRow>())
                    {
                        table.RemoveChild<TableRow>(row);
                        continue;

                    }
                }             
                doc.Save();
            }
        }

该文档只有一页,只有一个表包含四行,但是由于某种原因,以上内容并未删除任何行。

我也尝试过

row.Remove()

这也没有效果,即在运行此行之后,不会删除任何行。任何想法这有什么问题吗?这就是我的文档的样子

enter image description here

谢谢

c# ms-word openxml openxml-sdk
1个回答
0
投票

[第一次尝试时,您使用了IEnumerable<TableRow>方法创建的OpenXmlElement.Elements<T>(),该方法从TableRowChildElements的集合中枚举了Table实例。 ChildElements的集合是动态计算的,并且使用yield return返回实例。当您通过删除元素来更改ChildElements的集合时,会发生这种情况,

  1. 这意味着您正在断开孩子与他们的父母和兄弟姐妹之间的联系,
  2. 这意味着您没有完整的TableRow元素集,
  3. 这意味着您无法删除TableRow实例。

但是,我想您应该可以删除第一个TableRow实例。

使用ToList(),您可以实现TableRow实例的集合,并将所有实例保存在单独的List<TableRow>中。这样,您正在处理一个固定的集合,而不是随行进行动态计算的集合。这就是为什么它起作用的原因。

一般而言,您永远都不应更改您枚举的集合(例如,通过删除集合的元素)。

© www.soinside.com 2019 - 2024. All rights reserved.