C# 从Excel工作表中删除空行

C# 从Excel工作表中删除空行,c#,excel,worksheet,C#,Excel,Worksheet,我做了一些搜索,但似乎找不到一个快速的方法来清除工作表中的所有空白行。我不想占用太多时间。有这样的方法吗 我尝试了一些并不出色的方法,包括过滤所有列中的空白,然后删除屏幕上的内容。也许excel中有一个函数我在这里遗漏了 我正在寻找像UsedRange.RemoveDuplicates()函数这样的函数,它在一两秒钟内完成了大量工作。如果您需要函数在excel中快速工作,您应该设置全局excel应用程序变量,例如“Visible=false”、“ScreenUpdate=false”。过滤空白并

我做了一些搜索,但似乎找不到一个快速的方法来清除工作表中的所有空白行。我不想占用太多时间。有这样的方法吗

我尝试了一些并不出色的方法,包括过滤所有列中的空白,然后删除屏幕上的内容。也许excel中有一个函数我在这里遗漏了


我正在寻找像
UsedRange.RemoveDuplicates()
函数这样的函数,它在一两秒钟内完成了大量工作。

如果您需要函数在excel中快速工作,您应该设置全局excel应用程序变量,例如“Visible=false”、“ScreenUpdate=false”。过滤空白并删除它们应该是最快的方法,尽管我会手动创建要删除的行的列表,然后在一次调用中删除它们

RowsToDelete = "2:2;4:4;8:8";
Range = Sheet.Range()
Range.Delete()

如果需要在excel中快速运行函数,则应设置全局excel应用程序变量,例如“Visible=false”、“ScreenUpdate=false”。过滤空白并删除它们应该是最快的方法,尽管我会手动创建要删除的行的列表,然后在一次调用中删除它们

RowsToDelete = "2:2;4:4;8:8";
Range = Sheet.Range()
Range.Delete()

这里有两种方法可以删除活动工作表上的所有空行

1 VBA。这种方式应该比在行中循环快得多:

cells.RowDifferences(cells(rows.Count,columns.Count)).rows.Hidden=true
cells.SpecialCells(xlCellTypeVisible).EntireRow.Delete
cells.Rows.Hidden=false
2键盘。这种方法只需撤消列表中的三个步骤,因此可以轻松撤消/追溯

第一步。选择数据单元格。 单击左角标题选择所有单元格,然后按Shift+Tab
Ctrl+\

第二步。隐藏和删除其余行。 按
Ctrl+9
Ctrl+A
Alt+
Ctrl+-

第三步。取消隐藏选定行并选择第一个单元格。按:
Ctrl+Shift+9
Ctrl+Home

之前

之后


以下是删除活动工作表上所有空行的两种方法

1 VBA。这种方式应该比在行中循环快得多:

cells.RowDifferences(cells(rows.Count,columns.Count)).rows.Hidden=true
cells.SpecialCells(xlCellTypeVisible).EntireRow.Delete
cells.Rows.Hidden=false
2键盘。这种方法只需撤消列表中的三个步骤,因此可以轻松撤消/追溯

第一步。选择数据单元格。 单击左角标题选择所有单元格,然后按Shift+Tab
Ctrl+\

第二步。隐藏和删除其余行。 按
Ctrl+9
Ctrl+A
Alt+
Ctrl+-

第三步。取消隐藏选定行并选择第一个单元格。按:
Ctrl+Shift+9
Ctrl+Home

之前

之后

对于非常大的数据集(100k+行),我总是发现按空格排序然后删除比过滤和删除大量分隔行要快得多。 如果空白行在整个文件中展开,则可以在5到10倍之间。对于非常大的数据集(100k+行),我总是发现它“强”大于“大”/“强”>更快地排序,然后删除,而不是过滤和删除许多分离的行。
如果空白行在整个文件中展开,则可以在5到10倍之间更快。

遍历每一行需要花费很长时间,但这仅仅是因为for循环开销。主操作工作表function.CountA和Range.EntireRow.Delete实际上不会花费很长时间

我找到的最好的解决方案是从10万行开始,删除所有没有值的行,然后以10的幂向下移动,直到达到单行级别

无论您是试图删除数据周围多余的空格,还是偶尔删除主数据范围内的单行,这都非常快

Public Sub removeblankrows()
Dim ws As Worksheet: Set ws = ActiveSheet

With WorksheetFunction
    Dim pow As Long

    For pow = 6 To 0 Step -1

        Dim chunkSize As Long: chunkSize = 10 ^ pow

        Dim chunks As Long: chunks = (ws.UsedRange.Rows.Count \ chunkSize) + 1

        Dim c As Long
        For c = chunks To 1 Step -1
            Dim last As Long, first As Long

            last = .Min(c * chunkSize, ws.Rows.Count)
            first = .Max(1, (c - 1) * chunkSize)

            Dim c1 As Range, c2 As Range, rng As Range
            Set c1 = ws.Cells(first, 1)
            Set c2 = ws.Cells(last, ws.UsedRange.Columns.Count)

            Set rng = ws.Range(c1, c2)

            If .CountA(rng) = 0 Then rng.EntireRow.Delete

        Next c

    Next pow
End With

End Sub

遍历每一行需要很长时间,但这只是因为FOR循环的开销。主操作工作表function.CountA和Range.EntireRow.Delete实际上不会花费很长时间

我找到的最好的解决方案是从10万行开始,删除所有没有值的行,然后以10的幂向下移动,直到达到单行级别

无论您是试图删除数据周围多余的空格,还是偶尔删除主数据范围内的单行,这都非常快

Public Sub removeblankrows()
Dim ws As Worksheet: Set ws = ActiveSheet

With WorksheetFunction
    Dim pow As Long

    For pow = 6 To 0 Step -1

        Dim chunkSize As Long: chunkSize = 10 ^ pow

        Dim chunks As Long: chunks = (ws.UsedRange.Rows.Count \ chunkSize) + 1

        Dim c As Long
        For c = chunks To 1 Step -1
            Dim last As Long, first As Long

            last = .Min(c * chunkSize, ws.Rows.Count)
            first = .Max(1, (c - 1) * chunkSize)

            Dim c1 As Range, c2 As Range, rng As Range
            Set c1 = ws.Cells(first, 1)
            Set c2 = ws.Cells(last, ws.UsedRange.Columns.Count)

            Set rng = ws.Range(c1, c2)

            If .CountA(rng) = 0 Then rng.EntireRow.Delete

        Next c

    Next pow
End With

末端接头

您是在寻找C#还是VBA?我问的原因是您提供的示例是VBA函数?您是在寻找C#还是VBA?我问的原因是您提供的示例是VBA函数吗?这就是我要推荐的(VBA方式)虽然我会先使用
xlCellTypeBlank
然后使用
.EntireRow.Delete
@AlexandreP.Levasseur,但是如果所有列中的空格都相同,那么您建议的方法效果很好,但如果不同列中有空格,则不会这样做-在上述情况下,将删除所有行。我还没有检查,但我想类似的方法在C#中也可以使用。这就是我要推荐的(VBA方式)虽然我会先使用
xlCellTypeBlank
然后使用
.EntireRow.Delete
@AlexandreP.Levasseur,但是如果所有列中的空格都相同,那么您建议的方法效果很好,但如果不同列中有空格,则不会这样做-在上述情况下,将删除所有行。我没有检查过,但我想类似的方法在C#中也有。