2012-03-19 8 views
2

私はopenxml sdkを使って作業しており、docという単語に書き込むテーブルを持っています。いったんテーブルを書いたら、そのテーブルのすべてのカラムを選択し、そのカラムのテキストに基づいてそれらのテーブルの1つを削除しますか?例:カラム名でカラムを削除する

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

上記の疑似コードは実際に実装されていますか?

答えて

2

残念ながら、ワード処理テーブル(DocumentFormat.OpenXml.WordProcessing.Table)には「列」の概念はなく、行とセルのみがあります。最初の行に列名が含まれており、すべての行に同じ数のセルが含まれていると想定できる場合は、その作業を完了できます。あなたが気を付けなければならないこと(そしてあなたの擬似コードの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; 
} 
関連する問題