我正在使用 openxml sdk 并有一个表可以写入 Word 文档。一旦我编写了表格,是否可以选择该表的所有列并根据该列的文本删除其中一列?例如:
foreach (var column in table.columns)
{
if (column.Text == "Hello")
{
table[column].delete();
}
}
上述伪代码是否有现实世界的实现?
最佳答案
不幸的是,文字处理表 (DocumentFormat.OpenXml.WordProcessing.Table
) 中没有“列”的概念,只有行和单元格。如果您可以假设第一行包含列名称,并且所有行包含相同数量的单元格,则您可以完成任务。您必须注意的一件事(以及上面伪代码中的一个问题)是您无法从当前正在迭代的枚举中删除内容。以下是我实现这一目标的方法:
var rows = table.Elements<TableRow>();
var firstRowCells = rows.ElementAt(0).Elements<TableCell>();
var cellNumbersToDelete = new List<int>();
for( int i=0; i<firstRowCells.Count(); i++ )
if( GetCellText( firstRowCells.ElementAt( i ) ) == "Hello" )
cellNumbersToDelete.Add( i );
foreach( var cellNumberToDelete in cellNumbersToDelete ) {
foreach( var row in rows ) {
cellToDelete = row.ElementAt( cellNumberToDelete );
row.RemoveChild( cellToDelete );
}
}
我现在没有时间测试这个解决方案,所以它可能需要一些调整,但它应该让您对如何完成任务有一个总体了解。上面引用的方法 GetCellText
看起来像这样:
string GetCellText( TableCell cell ) {
var p = cell.Elements<Paragraph>().First();
var r = p.Elements<Run>().First();
var t = r.Elements<Text>().First();
return t.Text;
}
关于c# - 按列名称删除列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9776822/