Office Interop读取不正确的单元格值

时间:2015-10-15 10:44:56

标签: c# excel office-interop excel-interop

尝试遍历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();
        }
    }
}

前两行的效果很好。然而,它似乎变得混乱。

第三行是完全空的。然而,当它遍历列时,当这个循环到达列&#34; I&#34;时,它会在那里读取一个值。该值实际上是第4行,第34行和第34行; J&#34;。

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

我对此感到困惑。是否有一些我错过的明显内容?

1 个答案:

答案 0 :(得分:1)

是的,你遗漏了一些非常明显的东西。您正在删除单元格。在该操作之后,您对要选择的单元格的计算不再起作用。

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

删除时的移动方向也可能是一个因素 - 您可以通过将参数传递给删除功能来控制它。

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

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
        }
    }
}