2012-03-19 4 views
2

openxml sdk로 작업 중이며 doc이라는 단어에 쓸 테이블이 있습니다. 테이블을 작성한 후에는 해당 테이블의 모든 열을 선택하고 해당 열의 텍스트를 기반으로 테이블 중 하나를 삭제 하시겠습니까? 예 :열 이름으로 열 제거

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

위 의사 코드의 실제 구현이 있습니까?

답변

2

불행히도 워드 프로세싱 테이블 (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; 
}