迭代通过excel行跳过一个数字每一次它通过foreach循环,拉错单元格值。 为什么

我有这个方法需要两个string参数,并遍历Excel工作表中的每一行来查找两列中的匹配。 当它发现一个匹配时,它返回行号,这样的数字可以用来确定(在另一个方法)哪一行更新。

public int IterateRows(string f, string l) { Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(locationAndNameOfExcelFile, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); Microsoft.Office.Interop.Excel._Worksheet xlWorksheet = (Microsoft.Office.Interop.Excel._Worksheet)xlWorkbook.Sheets[1]; //Iterate the rows in the used range foreach (Microsoft.Office.Interop.Excel.Range row in xlWorksheet.UsedRange.Rows) { var familyNameCellValue = row.Cells[row.Row, 2].Value2.ToString(); var firstNameCellValue = row.Cells[row.Row, 3].Value2.ToString();; if (f == familyNameCellValue && firstNameCellValue == l) { return row.Row; } } return -1; } 

问题是,当通过每个foreach迭代进行debugging时,当将鼠标hover在“row.Row”值上时,我注意到这是正确的(就像在不跳过Excel行一样)。 我知道一个事实,认为某个Cell值的值应该是别的。 它似乎跳到这样的

  • 如果“row.Row”读取2,它具有第三行单元格的值,
  • 如果“row.Row”读取3,则它具有第5行单元格的值,
  • 如果“row.Row”读取4,它具有第7行单元格的值,
  • 如果“row.Row”读取5,则它具有第9行单元格的值,
  • 如果“row.Row”读取6,它具有第11行单元格的值,
  • 如果我寻求的行是一个奇数,它将显然返回“row.Row”

有人可以解释为什么它跳过?

解决了它(有点肮脏,我仍然不明白为什么它在每个迭代中跳过一行,但我添加了“var i”来跟踪我所在的行。给定每次迭代的传播,所以我只是设置一个新的“var r”来表示基于三元运算符的行,因为第一行是头似乎总是工作

  public int IterateRows(string f, string l) { Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); Microsoft.Office.Interop.Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(locationAndNameOfExcelFile, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); Microsoft.Office.Interop.Excel._Worksheet xlWorksheet = (Microsoft.Office.Interop.Excel._Worksheet)xlWorkbook.Sheets[1]; var rowsRanged = xlWorksheet.UsedRange.Rows; var i = 1; //Iterate the rows in the used range foreach (Microsoft.Office.Interop.Excel.Range row in rowsRanged) { var r = row.Row > 1 ? row.Row - i : row.Row; var familyNameCellValue = row.Cells[r, 2].Value2.ToString(); var firstNameCellValue = row.Cells[r, 3].Value2.ToString(); //var familyNameCellValue = row.Cells[i, 2].Value2.ToString(); //var firstNameCellValue = row.Cells[i, 3].Value2.ToString(); if (f == familyNameCellValue && firstNameCellValue == l) { return i - 1; } i++; } return -1; }