[英]Interop.Excel - using output.,Rows[i].Delete() is shifting the rows up so that the most recent shifted row is not checked by for loop
public void deleteInvalidEmployees(string path)
{
Application app = new Application();
Workbook wb = app.Workbooks.Open(path);
Worksheet output = wb.ActiveSheet;
Range range = output.UsedRange;
var LastRow = output.UsedRange.Rows.Count;
Console.ForegroundColor = ConsoleColor.Green;
for (int i = 2; i <= LastRow; i++)
{
bool containsLetters = false;
string value = Convert.ToString(output.Cells[i, 2].Value);
if (value != null && value != "")
{
if (Regex.IsMatch(value.ToUpper(), "[A-Z]"))
{
Console.WriteLine("Contains letters for row " + i);
containsLetters = true;
}
}
if (value == "" || containsLetters == true || value == null)
{
Console.WriteLine("Deleting empty row " + i);
output.Rows[i].Delete();
}
}
wb.Save();
wb.Close();
app.Quit();
}
如上所述,我只是對行進行簡單的刪除,但是問題是在刪除行之后,它會將行上移(這是我想要的),但是這意味着Forloop會跳過最近移動的行。 例如,如果刪除了行2000,則行2001移至行2000的位置,因此for循環將遞增,然后檢查“新”行2001,這意味着移至位置2000的“舊”行為跳過。
我的第一個顯而易見的解決方案是,每當發生刪除操作時就將i減1,以便用新行重新檢查當前i的位置,但是這不起作用。
您將i
減i
想法很好,但您也應減少LastRow
以防止IndexOutOfRangeException。
output.Rows[i].Delete();
i--;
LastRow--;
您不必每次都減少LastRow
,而可以直接在for循環中檢查行數。
for (int i = 2; i <= output.UsedRange.Rows.Count; i++)
正如zhiven所建議的,甚至更好,您可以反轉循環。 然后,您不必在每次刪除時都更新i
,並且您一定要檢查每一行。
for (int i = output.UsedRange.Rows.Count; i >= 2; i--)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.