我正在使用 openxml sdk 并有一个表格可以写入 word doc。一旦我写了我的表,是否有选择该表的所有列并根据该列的文本删除其中一个?例如:
foreach (var column in table.columns)
{
if (column.Text == "Hello")
{
table[column].delete();
}
}
上述伪代码是否有现实世界的实现?
我正在使用 openxml sdk 并有一个表格可以写入 word doc。一旦我写了我的表,是否有选择该表的所有列并根据该列的文本删除其中一个?例如:
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;
}