Удаление столбца по имени столбца - PullRequest
2 голосов
/ 19 марта 2012

Я работаю с openxml sdk и у меня есть таблица для записи в слово doc. После того, как я написал свою таблицу, есть ли способ выбрать все столбцы для этой таблицы и удалить один из них на основе текста для этого столбца? Например:

foreach (var column in table.columns)
{
    if (column.Text == "Hello")
    {
       table[column].delete();
    }
}

Существует ли реальная реализация вышеуказанного псевдокода?

1 Ответ

2 голосов
/ 20 марта 2012

К сожалению, нет понятия «столбец» в таблице обработки текста (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;
}
...