Удаление столбца по имени столбца
Я работаю с openxml SDK и у меня есть таблица для записи в слово док. После того, как я написал свою таблицу, есть ли способ выбрать все столбцы для этой таблицы и удалить один из них на основе текста для этого столбца? Например:
foreach (var column in table.columns)
{
if (column.Text == "Hello")
{
table[column].delete();
}
}
Есть ли в реальности реализация вышеуказанного псевдокода?
1 ответ
К сожалению, нет понятия "столбец" в таблице обработки текста (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;
}