Epplus 删除特定行以下的所有行

9

有没有办法从特定(空)行开始删除所有后续行?我尝试过使用循环。

            for (int rowNum = 1; rowNum <= worksheet.Dimension.End.Row; rowNum++)
            {
                var rowCells = from cell in worksheet.Cells
                               where (cell.Start.Row == rowNum)
                               select cell;

                if (!rowCells.Any(cell => cell.Value != null))
                {
                    worksheet.DeleteRow(rowNum);
                }

            }

如果在Excel中有数百万个空行,删除这些行将需要几分钟的时间。

Epplus提供了这个方法worksheet.DeleteRow(int rowFrom, int rows),但我不知道所有额外空行的数量。

在下面的例子中,我需要删除12行及以上的所有行,但问题是我不知道具体的行数,即空行从哪一行开始。

enter image description here

另一种方法是找到最后一个非空行,然后删除该范围内的所有内容,这种方法会更快,但在表格中还有另一个问题是空行。
ws.DeleteRow(lastFilledTableRow, workSheet.Dimension.End.Row - tableRowsCount,true);

在这个例子中,问题出在红色行,但也许我会告诉用户这种Excel格式是无效的,并绕过这个问题。

enter image description here


所以你有空行,接着下面的行有一些数据,然后再次为空,再次有一些数据,如此循环?但是在开头有一些你想要保留的行吗?(或者也许你在问题中把列和行搞混了?)如果你能画出ASCII图或展示图片会更有帮助。 - Vanity Slug
@alex,我更新了问题,希望更容易理解。我知道这些空行可以在数据库中删除,但由于空行的存在,我在导入Excel时遇到了问题,因此需要先删除它们。我还考虑为用户设置一些行限制,例如百万行,并自动删除其他所有内容。 - Muflix
1
朋友,我已经复现了你的问题,但是目前还没有找到解决方案。 - Vanity Slug
2个回答

20

我知道这很老旧,但我找不到任何解决方案,所以我自己写了一个。它会检查最后一行是否为空,如果是,则删除该行,并重复此操作,直到找到非空行。(这里的非空指的是:该行中所有列都有某些值)

worksheet.TrimLastEmptyRows();

public static void TrimLastEmptyRows(this ExcelWorksheet worksheet)
    {
        while (worksheet.IsLastRowEmpty())
            worksheet.DeleteRow(worksheet.Dimension.End.Row);
    }

public static bool IsLastRowEmpty(this ExcelWorksheet worksheet)
    {
        var empties = new List<bool>();

        for (int i = 1; i <= worksheet.Dimension.End.Column; i++)
        {
            var rowEmpty = worksheet.Cells[worksheet.Dimension.End.Row, i].Value == null ? true : false;
            empties.Add(rowEmpty);
        }

        return empties.All(e => e);
    }

我喜欢你的解决方案,但是如果有考虑空行的选项会更好。在我看来,只有当一行的所有单元格值都为空时,该行才是空行。 - MMalke
太棒了!救了我的一天!谢谢你 :) - Vinit Divekar
在一行中检查空行的代码是 return Enumerable.Range(1, worksheet.Dimension.End.Column).Select(i => worksheet.Cells[worksheet.Dimension.End.Row, i].Value == null).All(x => x); - Bamdad

5
上面的解决方案是删除文件中的最后空行。如果文件在行列表的中间有空行,则此方法不起作用。
下面是解决方案,用于识别行列表中间的空行。
我将上述方案和我的方案相结合,以删除行列表末尾的空行和行列表中间的空行。
 private void TrimEmptyRows(ExcelWorksheet worksheet)
    {
        //loop all rows in a file
        for (int i = worksheet.Dimension.Start.Row; i <= 
       worksheet.Dimension.End.Row; i++)
        {
            bool isRowEmpty = true;
            //loop all columns in a row
            for (int j = worksheet.Dimension.Start.Column; j <= worksheet.Dimension.End.Column; j++)
            {
                if (worksheet.Cells[i, j].Value != null)
                {
                    isRowEmpty = false;
                    break;
                }
            }
            if (isRowEmpty)
            {
                worksheet.DeleteRow(i);
            }
        }
    } 

2
如果删除行下方直接有空行,则该空行将获得相同的行号,因此在增加行号时将被跳过。如果从底部向上扫描行,则不会发生这种情况,for (int i = worksheet.Dimension.End.Row; i >= worksheet.Dimension.Start.Row; i--) - ivvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接