我有这个方法,它接受两个字符串参数并遍历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值的值应该是其他值。它似乎跳到了这样的
有人可以解释为什么会跳过吗?
答案 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();
像瑞士手表一样为我工作。