【问题标题】:How do I access a cell in Excel Interop when using filtered ranges?使用筛选范围时如何访问 Excel 互操作中的单元格?
【发布时间】:2011-12-12 04:49:35
【问题描述】:

我最初有一个代码段,它使用 UsedRange 遍历 Excel 电子表格的行:

           range = ws.UsedRange;
           for (int row = 3; row <= range.Rows.Count; row++)
            {
                Object nObj = ((Excel.Range)ws.Cells[row, "N"]).Text;
            }

但我只需要获取应用过滤器后剩余的行,因此(在查看 How can I get the Range of filtered rows using Excel Interop? 之后)我更改了代码:

    range = ws.UsedRange.SpecialCells(Excel.XlCellType.xlCellTypeVisible, Type.Missing);
    foreach (Excel.Range area in range.Areas)
    {
        foreach (Excel.Range row in area.Rows)
            //for (int row = 3; row <= range.Rows.Count; row++)
            {
                Object nObj = ((Excel.Range)ws.Cells[row, "N"]).Text;
            }
    }

除了现在我遇到类型不匹配错误。我在这里缺少什么基本的东西?

【问题讨论】:

    标签: c# visual-studio-2008 excel excel-interop


    【解决方案1】:

    我相信您在调用 ws.Cells[row, "N"] 时遇到了类型不匹配。在原始代码中,row 是一个int。在修改后的代码中,row 是一个Excel.Range

    鉴于,在修改后的代码中,row 是一个单行(多列)范围,您需要做的就是索引该行中对应于 N 列的单元格。假设您的范围从列开始A,这将是第 14 列中的单元格。

    例如

    Object nObj = ((Excel.Range)row.Cells[1, 14]).Text;
    

    【讨论】:

    • 此响应导致我出现语法错误。 Visual Studio 说“'this' 没有重载需要 '1' 参数。” Cells 正在寻找两个参数,rowIndex 和 ColumnIndex。
    • 好的,我已经编辑了答案。现在正在传递列索引和行索引。
    • 这也不对。这告诉 nObj 使用 [1, 14] 的字面 Cell 中的值。
    • 它正在选取行对象的第 1 行第 14 列中的单元格。请注意,代码中显示的是 row.Cells[1, 14] 而不是 ws.Cells[1, 14]。在每次迭代中,行对象是来自当前 rea 对象的单行。如果该行从 A 列开始,则工作表的 N 列将对应于该行的第 14 列。如果该行不是从 A 列开始,那么您需要相应地调整列索引。
    • 是的,这样做的蛮力方法是添加 'if (row.Row == 1) { continue; }´ 在对象分配之前。
    猜你喜欢
    • 2010-12-27
    • 2017-07-20
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多