Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我不能删除Excel中的行?_C#_Epplus_Epplus 4 - Fatal编程技术网

C# 为什么我不能删除Excel中的行?

C# 为什么我不能删除Excel中的行?,c#,epplus,epplus-4,C#,Epplus,Epplus 4,我使用以下代码仅删除索引为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)) { va

我使用以下代码仅删除索引为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"));
  }
使用(var p=new ExcelPackage(fi)){
var ws=p.Workbook.Worksheets[1];
var start=ws.Dimension.start;
var end=ws.Dimension.end;

对于(int row=start.row+1;row我认为问题在于您是自上而下循环的。当您删除单元格时,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);
            }

        }
两个旁注:

  • 如果每次都要计算同一列,则无需循环遍历这些列。只需检查每行该单元格的值即可
  • 将永远不会为空,因为有
    ??
    运算符。您可以简化if语句,只检查
    字符串。空
  • String.Empty
    是相同的值,因此您只需计算其中一个值
  • 在计算字符串时,我建议使用
    .Equals()
    。使用
    =
    可能会导致一些不好的结果。

我已经用最少的、完整的example@mason与Office相关的一切都从1开始您是否在
ws.DeleteRow(第1行);
设置了断点?它是否被命中?是的,在断点中它工作并向我显示正确的索引行。我也不知道如何检测行的结尾以进行汇总