为什么我不能在Excel中删除行?

时间:2019-04-03 23:02:45

标签: c# epplus epplus-4

我使用此代码使用EPPlus删除索引为10的一行:

using (var p = new ExcelPackage(fi))
{
   var ws = p.Workbook.Worksheets[1];
   ws.DeleteRow(10, 1);
}

保存输出文件时,我看到文件中存在该行:

p.SaveAs(new FileInfo("c:\\output.xlsx"));

为什么不删除行?

我的完整代码是:

  using(var p = new ExcelPackage(fi)) {

   var ws = p.Workbook.Worksheets[1];
   var start = ws.Dimension.Start;
   var end = ws.Dimension.End;

   for (int row = start.Row + 1; row <= end.Row; row++) {
    for (int col = start.Column; col <= end.Column; col++) {

     var value = ws.Cells[row, 5].Value ? ? string.Empty;
     if (value == null || value == String.Empty || value == "") {

      ws.DeleteRow(row, 1);

     }
    }
   }

   p.SaveAs(new FileInfo("c:\\Projects\\excel\\output.xlsx"));
  }

我尝试删除索引为5的列中值为空的所有行

1 个答案:

答案 0 :(得分:1)

我认为问题在于您是从上到下循环播放。删除单元格时,excel会自动将剩余的行向上移动,这将导致从上向下循环时跳过行。

为您的循环尝试一下:

 for (int row = end.Row; row >= start.Row; row--)
        {
            var value = ws.Cells[row, 5].Value ?? string.Empty;

            if (value.Equals(String.Empty))
            {
                ws.DeleteRow(row, 1);
            }

        }

旁注:

  • 如果您每次都评估同一列,则无需遍历各列。只需检查每一行的该单元格的值即可。
  • value永远不会为空,因为??运算符。您可以简化if语句,仅检查String.Empty
  • String.Empty""是相同的值,因此您只需要评估一个或另一个。
  • 在评估字符串时,我建议使用.Equals()。使用==可能会导致不良结果。 C# difference between == and Equals()