我使用c#使用INTEROP连接到excel。
如果不知道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 :(得分: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);
答案 1 :(得分:0)
将范围的内容传输到二维数组。针对阵列进行工作(更快)。然后将数组传回工作表。