Epplus删除特定行中的所有行

时间:2017-06-23 15:38:21

标签: c# epplus

有可能以某种方式删除特定(空)行中的所有后续行吗?我试过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+行,但问题是我不知道特定行,空行开始的位置。

enter image description here

备用aproach可以找到最后一个非空行并删除范围的所有内容,这样会更快,但是表格中还有另一个空行问题。

ws.DeleteRow(lastFilledTableRow, workSheet.Dimension.End.Row - tableRowsCount,true);

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

enter image description here

2 个答案:

答案 0 :(得分:8)

我知道它已经老了,但我找不到任何解决方案,所以我自己做了一个。 它检查最后一行是否为空,如果是,则删除它并执行此操作直到找到非空行。 (非空意味着:此行中的所有列都有一些值)

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

答案 1 :(得分:3)

以上解决方案是删除文件中的最后一个空行。如果文件在行列表中间某处有空行,则此方法将无效。

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

我使用上述和我的组合来删除行列表末尾的空行和行列表中间的空行

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