2012-04-02 4 views
0

INTEROP를 사용하여 Excel에 연결할 때 C#을 사용하고 있습니다.열을 반복하고 소속되지 않은 행을 삭제합니다.

INTEROP을 모른다면이 질문에 답할 수 없습니다. 나는 다음에 대한 알고리즘을 알아 내려고 내 뇌를 고문하고 있습니다 :

가정하자 내가 가진 문자열 내가 목록을 가지고 string1="ALEX"

:

AAAA 
ALEX 
ALEX 
LIZA 
LIZA 

또는 목록은 다음과 같습니다

ALEX 
ALEX 
ALEX 
LIZA 
NANCY 

모든 문자열을 삭제해야합니다. NOT== ALEX

너무 오래 걸리므로 하나씩 처리하고 싶지 않습니다.

목록은 항상 정렬되어 있으며 필요한 문자열 목록에서 시작 위치와 끝 위치를 가져오고 싶습니다. 이 전혀 작동하지 않는

if (cell.Value2.ToString()!= email && !foundStart) { 
    startpos = rCnt; 
    foundStart = true; 
} 
else if (cell.Value2.ToString() != email && foundStart) { 
    endPos = rCnt; 
    deleteRange = xlWorkSheet.get_Range("A" + startpos + ":" + "CO" + endPos, Type.Missing); 
    deleteRange = deleteRange.EntireRow; 
    deleteRange.Delete(Excel.XlDeleteShiftDirection.xlShiftUp); 
    foundStart = false; 
} 

:

제거 나는 모든 행을 통해 루프 내부에가는 루프를 가지고있다. 도와주세요! 귀하의 지침은 간단한 알고리즘 또는 사용할 수있는 특정 코드의 측면에서 될 수 있습니다

+0

엘리먼트를 하나씩 삭제하는 대신 삭제하려면 RANGE를 지정해야합니다. –

+0

목록이 AAAA, ALEX, ALEX, LIZA 인 경우 첫 번째를 삭제하면됩니다. 1 : 1의 범위이지만 AAA, AAA, ALEX라면 1 : 2를 삭제해야합니다. –

+0

아마도 내가 잘못되었지만 그 범위는 나를 설득하지 않습니다. startPos 및 endPos는 행 번호가 맞지 않습니까? 그리고 이것은 예를 들어, get_Range ("A1 : CO3")? 유효 범위입니까? – Steve

답변

0

목록이 항상 정렬되어 있으면 삭제할 목록에서 요소를 찾을 수있는 이진 검색을 사용하십시오.

function binarySearch (int lowRow, int highRow, int currentRow, string searchValue, string[] values) { 
    if values[currentRow] < searchValue 
     return binarySearch (lowRow, currentRow, (currentRow - lowRow)/2, searchValue, values); 
    else if values[currentRow] > searchValue 
     return binarySearch (currentRow, highRow, (highRow - currentRow)/2, searchValue, values); 
    else 
     return currentRow; 
} 

var searchTerm = "ALEX"; 
var foundRow = binarySearch(1, listFromExcel.RowCount, listFromExcel.RowCount/2, searchTerm, listFromExcel); 

var lowRow = foundRow; 
var highRow = foundRow; 

while (listFromExcel[lowRow] == searchTerm) 
    lowRow--; 
lowRow++; 

while (listFromExcel[highRow] == searchTerm) 
    highRow++; 
highRow++; 

listFromExcel.DeleteRange(lowRow, highRow); 
+0

너무 많이 고마워! 이진 정렬을 사용하여 요소를 삭제하는 방법은 무엇입니까? –

+0

이진 검색은 삭제할 행의 범위를 찾는 것입니다. 삭제할 범위가 있으면 해당 범위를 사용하여 삭제하십시오. – saluce

+0

보다 구체적으로, 일단 이진 검색으로 일치하는 항목을 찾았 으면 더 이상 일치 항목이 없을 때까지 행별로 위아래로 이동하십시오. 첫 번째 요소와 마지막 요소의 행 번호를 기록한 다음 해당 범위를 삭제에 사용하십시오. – saluce

0

범위의 내용을 2 차원 배열로 전송하십시오. 배열에 대한 작업을 수행하십시오 (훨씬 더 빠름). 그런 다음 배열을 다시 워크 시트로 전송하십시오.

+0

나는 엑셀 포맷을 유지해야하기 때문에 그럴 수 없다. –

+0

포맷팅에 영향을 미치지 않아야한다 ... – Dan

관련 문제