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

时间:2016-05-12 08:52:29

标签: c# excel excel-interop

我有这个方法,它接受两个字符串参数并遍历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迭代进行调试时,当将鼠标悬停在“row.Row”值上时,我注意到它是正确的(如不跳过Excel行)。我知道一个事实,认为某个Cell值的值应该是其他值。它似乎跳到了这样的

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

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

2 个答案:

答案 0 :(得分:0)

解决了它(它有点脏,我仍然不明白为什么它在每个foreach迭代中跳过一行,但我添加了一个" 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;
    }

答案 1 :(得分:0)

整个上午都在努力寻找解决同一问题的方法,感觉一点点补充仍然有用。您的错误是您要像在整个范围内的单元格一样对单元格进行寻址,而一行只是单元格的水平水平线:Cell [1,1],Cell [1,2] ...表中该行的原始索引有多大。

所以,代替这个

var familyNameCellValue = row.Cells[row.Row, 2].Value2.ToString();

只需这样写:

var familyNameCellValue = row.Cells[1, 2].Value2.ToString();

像瑞士手表一样为我工作。