如何使用 OOXML 删除 WordProcessingML 中的 TableRow?
How to delete a TableRow in WordProcessingML using OOXML?
我有一个非常简单的文档,只有一个 table 和一些空白行,我正在尝试删除所有行。 (目的是最终实际上只删除空白行,但我根本没有删除任何行)。
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();
}
}
该文档只有一页,只有一页 table 四行,但由于某种原因,上面的内容没有删除任何行。
我也试过了
row.Remove()
这也没有任何效果,即在 运行 之后没有删除任何行。任何想法这有什么问题?这是我的文档的样子
谢谢
在您的第一次尝试中,您使用了由 OpenXmlElement.Elements<T>()
方法创建的 IEnumerable<TableRow>
,该方法从您的 [=14] 的 ChildElements
集合中枚举了 TableRow
个实例=]. ChildElements
的集合是动态计算的,实例是使用 yield return
返回的。当您通过删除元素
更改 ChildElements
的集合时会发生这种情况
- 这意味着您正在破坏 children 与他们的 parents 和兄弟姐妹之间的联系,
- 这意味着您没有获得完整的
TableRow
元素集,
- 这意味着您无法删除
TableRow
个实例。
不过,我猜你应该能够删除第一个 TableRow
实例。
使用 ToList()
,您可以具体化 TableRow
个实例的集合,并在单独的 List<TableRow>
中获取所有实例。通过这种方式,您处理的是固定集合,而不是动态计算的集合。这就是它起作用的原因。
作为一般规则,您永远不应更改您枚举的集合(例如,通过删除集合的元素)。
我有一个非常简单的文档,只有一个 table 和一些空白行,我正在尝试删除所有行。 (目的是最终实际上只删除空白行,但我根本没有删除任何行)。
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();
}
}
该文档只有一页,只有一页 table 四行,但由于某种原因,上面的内容没有删除任何行。
我也试过了
row.Remove()
这也没有任何效果,即在 运行 之后没有删除任何行。任何想法这有什么问题?这是我的文档的样子
谢谢
在您的第一次尝试中,您使用了由 OpenXmlElement.Elements<T>()
方法创建的 IEnumerable<TableRow>
,该方法从您的 [=14] 的 ChildElements
集合中枚举了 TableRow
个实例=]. ChildElements
的集合是动态计算的,实例是使用 yield return
返回的。当您通过删除元素
ChildElements
的集合时会发生这种情况
- 这意味着您正在破坏 children 与他们的 parents 和兄弟姐妹之间的联系,
- 这意味着您没有获得完整的
TableRow
元素集, - 这意味着您无法删除
TableRow
个实例。
不过,我猜你应该能够删除第一个 TableRow
实例。
使用 ToList()
,您可以具体化 TableRow
个实例的集合,并在单独的 List<TableRow>
中获取所有实例。通过这种方式,您处理的是固定集合,而不是动态计算的集合。这就是它起作用的原因。
作为一般规则,您永远不应更改您枚举的集合(例如,通过删除集合的元素)。