Office互操作读取不正确的单元格值

本文关键字:单元格 不正确 互操作 读取 Office | 更新日期: 2023-09-27 18:17:45

尝试遍历excel电子表格上的行和单元格,删除空行和单元格。我使用下面的例程来完成。

foreach(Range row in sheet.UsedRange.Rows)
{
    for (int i = 0; i < row.Columns.Count; i++)
    {
        Range cell = row.Cells[1, i + 1];
        if (cell.Value == null || String.IsNullOrEmpty(cell.Value.ToString()))
        {
            cell.Delete();
        }
    }
}

对于前两行可以正常工作。然而,它似乎变得混乱了。

第三行完全为空。然而,当它遍历列时,当循环到达列"I"时,它在那里读取一个值。这个值就是第4行第J列中的值

之后,它会变得更糟,丢失整行并从它找到的行中读取不正确的值。

我对此感到困惑。有什么明显的东西我没注意到吗?

Office互操作读取不正确的单元格值

是的,你错过了一些非常明显的东西。您正在删除单元格。在此操作之后,您选择哪个单元格的计算不再工作。

如果删除一个单元格,所有其他单元格将上移。这会导致你的row.Cells[1, i + 1]不正确。例如,如果删除第2行中的一个单元格,则永远不会检查第3行中同一列中的单元格的值,因为它在第2行中。

删除时移位的方向也可能是一个因素——您可以通过向Delete函数传递参数来控制它。

只需在删除一个列时重新检查同一列:

foreach (Range row in Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet.UsedRange.Rows)
{
    for (int i = 0; i < row.Columns.Count; i++)
    {
        Range cel = row.Cells[1, i + 1];
        if (cel.Value == null || String.IsNullOrEmpty(cel.Value.ToString()))
        {
            // default shift is up
            cel.Delete();
            // to shift left use cel.Delete(XlDeleteShiftDirection.xlShiftToLeft);
            i--; // this will do
        }
    }
}