4

我有以下方法:

    public static object getValue(Excel.Worksheet sheet, int row, int col)
    {
        Excel.Range r = sheet.Cells[row, col] as Excel.Range;
        //I've also tried using sheet.get_Range(cell, cell); here, with the same result

        if (r.Row != row || r.Column != col) 
        {   
            //Why does this debug statement sometimes print?
            Debug.Print("Tried to read (" + row.ToString() + ", " + col.ToString() + ") but got (" + r.Row.ToString() + ", " + r.Column.ToString() + ")");
        }

        return r.Value2;
    }

根据我对 Excel.Worksheet.Cells[row, column] 的理解,我的代码不应该进入 if 语句。但是,当我重复调用 getValue 以读取多个单元格时,它返回的范围的行和列经常与我调用 Excel.Worksheet.Cells 的行和列不同。

示例输出:“尝试读取 (19, 1) 但得到 (56, 5)”

此外,如果我中断 if 语句,然后倒回我的执行点并再次运行 Excel.Worksheet.Cells,我会得到正确的范围。

为什么会这样?

4

1 回答 1

1

这不是您直接问题的答案,但可能会解决问题。

是否getValue处于紧密循环中?如果是这样,那么我会以不同的方式处理它。由于访问CellsValue2是 COM 调用,它们比普通数组访问器慢。如果你有一个特定的范围,你正在循环,我会在内存中获取该范围的值数组并直接访问该数组而不是遍历单元格

例如,而不是

for(int r = 1; r <= 10; r++)
    for(int c = 1; c <= 20; c++)    
        double val = sheet.Cells[r,c];

object[,] values = sheet.Range("A1:J20").Value
for(int r = 1; r <= 10; r++)
    for(int c = 1; c <= 20; c++)    
        double val = values[r,c];

可以通过从紧密循环中删除 COM 访问并消除任何给您带来奇怪结果的问题来解决您的问题。

于 2013-04-05T18:17:02.313 回答