2

私はopenxml sdkを使用しており、ワードドキュメントに書き込むテーブルがあります。テーブルを作成したら、そのテーブルのすべての列を選択し、その列のテキストに基づいてそのうちの 1 つを削除する方法はありますか? 例えば:

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

上記の疑似コードの実際の実装はありますか?

4

1 に答える 1

3

残念ながら、ワード プロセッシング テーブル ( DocumentFormat.OpenXml.WordProcessing.Table) には「列」の概念はなく、行とセルのみです。最初の行に列名が含まれ、すべての行に同じ数のセルが含まれていると想定できる場合、タスクを達成できます。注意しなければならないことの 1 つ (および上記の疑似コードの問題の 1 つ) は、現在繰り返し処理している列挙から何かを削除できないことです。これを達成する方法は次のとおりです。

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;
}
于 2012-03-19T20:10:28.070 に答える