c# - 如何使用 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()
这也没有任何效果,即在运行后不会删除任何行。任何想法这有什么问题?这就是我的文档的样子
谢谢
解决方案
在您的第一次尝试中,您使用了IEnumerable<TableRow>
由OpenXmlElement.Elements<T>()
方法创建的,该方法TableRow
从ChildElements
您的Table
. 该集合ChildElements
是动态计算的,并使用返回实例yield return
。当您ChildElements
通过删除元素更改该集合时会发生这种情况,
- 这意味着你正在打破孩子与他们的父母和兄弟姐妹之间的联系,
- 这意味着你没有得到完整的
TableRow
元素集, - 这意味着您无法删除
TableRow
实例。
但是,我猜您应该能够删除第一个TableRow
实例。
使用,您可以具体化实例ToList()
的集合并在一个单独的. 这样,您正在处理一个固定的集合,而不是一个动态计算的集合。这就是为什么它有效。TableRow
List<TableRow>
作为一般规则,您永远不应该更改您枚举的集合(例如,通过删除集合的元素)。
推荐阅读
- nginx - 访问部署在 kubernetes 上的 istio-envoy 时 Nginx Bad Gateway 502
- python - 使用多处理包的冲突功能
- c# - 通过 C# Windows 窗体执行 Web 搜索
- javascript - 如何返回布尔可观察值并检查该布尔值
- python - 在python中返回解压列表
- django - CloudFoundry:如何使用多个构建包?(NGINX + Django/Gunicorn)
- php - 查询交易中更新库存数量
- google-maps - 如何根据距离和第一经纬度点得到下一经纬度位置?
- javascript - 为什么我的useEffect反应函数在页面加载时运行,尽管我给了它第二个值数组
- javascript - Angular google maps api交互问题