Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Office互操作读取不正确的单元格值_C#_Excel_Office Interop_Excel Interop - Fatal编程技术网

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

C# Office互操作读取不正确的单元格值,c#,excel,office-interop,excel-interop,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(cel

尝试迭代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();
        }
    }
}
foreach(sheet.UsedRange.Rows中的范围行)
{
对于(int i=0;i
对于前两行来说,这很好。然而,这似乎就失控了

第三排完全是空的。然而,当它遍历列时,当这个循环到达列“I”时,它在那里读取一个值。该值实际上是第4行“J”列中的值

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


我对此感到困惑。有什么明显的东西我遗漏了吗?

是的,你遗漏了一些非常明显的东西。您正在删除单元格。在该操作之后,要拾取的单元格的计算将不再有效

如果删除一个单元格,所有其他单元格都将上移。这会导致您的
行.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
        }
    }
}
foreach(Globals.ThisAddIn.Application.ActiveWorkbook.ActiveSheet.UsedRange.Rows中的范围行)
{
对于(int i=0;i
你能确切地解释一下你想做什么吗?如果要检查该行,请先检查该行,然后删除所有单元格。(仍然需要执行
i--
然后)我只是尝试从电子表格中删除空单元格。我想关键在于你的答案,你的意思是当单元格被删除时,自动选择的移位是“向上”。我需要它是“左”。我看到delete方法有一个paramater,它有望解决问题。@patrickhoffman是的,这是关键。我将编辑您的答案以包含它,然后接受它。谢谢你的帮助。