Epplus 从特定行中删除所有行

Epplus delete all rows from specific row

有可能以某种方式从特定(空)行中删除所有后续行吗?我试过 cyclus

            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+ 行,但问题是我不知道空行开始的具体行。

另一种方法是找到最后一个非空行并删除范围内的所有内容,这样会更快,但是 table.

中的空行还有另一个问题
ws.DeleteRow(lastFilledTableRow, workSheet.Dimension.End.Row - tableRowsCount,true);

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

我知道它很旧但我找不到任何解决方案所以我自己做了一个。 它正在检查最后一行是否为空,如果是,则将其删除并执行此操作直到找到 non-empty 行。 (non-empty 在这里的意思是:这一行中的所有列都有一些值)

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

以上解决方案是删除文件中最后的空行。如果文件在某处的行列表中间有空行,这将不起作用。

下面是识别行列表中间空行的解决方案。

我结合使用以上和我的方法来删除行列表末尾的空行和行列表中间的空行

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