Удаление столбца по имени столбца

Я работаю с 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;
}
Другие вопросы по тегам