代码之家  ›  专栏  ›  技术社区  ›  ForeverWintr

Excel中的奇怪行为。工作表。单元格[行,列]

  •  4
  • ForeverWintr  · 技术社区  · 12 年前

    我有以下方法:

        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.Workheet.Cells[行,列]的理解,我的代码永远不应该输入if语句。但是,当我重复调用getValue读取多个单元格时,它返回的范围中的行和列每隔一段时间就会与我调用Excel.Worksheet.cells时的行和栏不同。

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

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

    为什么会这样?

    1 回复  |  直到 12 年前
        1
  •  1
  •   D Stanley    12 年前

    这不是对你直接问题的回答,但可能会解决问题。

    getValue 在一个紧密的循环中?如果是这样的话,那么我会用不同的方式来处理它。自访问以来 Cells Value2 是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访问并消除任何给您带来奇怪结果的问题来解决您的问题。