来自Excel.Worksheet.Cells的奇怪行为[row,column]

时间:2013-04-05 18:03:42

标签: c# visual-studio-2008 .net-3.5 vsto excel-2010

我有以下方法:

    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,我得到正确的范围。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

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

getValue处于紧密循环中吗?如果是这样,那么我会以不同的方式接近它。由于访问CellsValue2是COM调用,因此它们比正常的数组访问器慢。如果你有一个特定的范围你正在循环我会得到内存中该范围值的数组并直接访问数组而不是循环遍历细胞

e.g。而不是

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

DO

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访问来解决您的问题并消除任何给您带来奇怪结果的问题。