首页 > 解决方案 > 如何使用 OOXML 删除 WordProcessingML 中的 TableRow?

问题描述

我有一个超级简单的文档,只有一个带有几行空白行的表格,我正在尝试删除所有行。(目的是最终只删除空白行,但我根本没有删除任何行)。

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()

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

在此处输入图像描述

谢谢

标签: c#ms-wordopenxmlopenxml-sdk

解决方案


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

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

但是,我猜您应该能够删除第一个TableRow实例。

使用,您可以具体化实例ToList()的集合并在一个单独的. 这样,您正在处理一个固定的集合,而不是一个动态计算的集合。这就是为什么它有效。TableRowList<TableRow>

作为一般规则,您永远不应该更改您枚举的集合(例如,通过删除集合的元素)。


推荐阅读