gpt4 book ai didi

c# - 如何使用 OOXML 删除 WordProcessingML 中的 TableRow?

转载 作者:行者123 更新时间:2023-12-04 10:22:28 26 4
gpt4 key购买 nike

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

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

谢谢

最佳答案

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

  • 这意味着您正在打破 child 与其 parent 和 sibling 之间的联系,
  • 这意味着你没有得到全套 TableRow元素,
  • 这意味着您不能删除 TableRow实例。

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

    使用 ToList() ,你物化了 TableRow的收藏实例并在单独的 List<TableRow> 中获取所有这些实例.通过这种方式,您正在处理一个固定的集合,而不是一个随您进行动态计算的集合。这就是为什么这有效。

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

    关于c# - 如何使用 OOXML 删除 WordProcessingML 中的 TableRow?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60788884/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com