簡體   English   中英

Interop.Excel-使用output。,Rows [i] .Delete()將行上移,以便for循環不檢查最近移動的行

[英]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的位置,但是這不起作用。

您將ii想法很好,但您也應減少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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM