如何在Excel中删除多余的行

我正在清理我的数据。 我已经看到了一些关于这个话题的脚步。 我遵循并应用了这些例子,但是我的脚本似乎有些问题。

我试图清理一个示例Excel文件的屏幕截图

我想要做的是删除整行时,没有。 列为空。 当我运行我的脚本只有一半的空行no。 列被删除。 在完全删除所有的空行之前,我将不得不多次运行我的脚本。 在PowerShell中删除行是否有限制,或者我缺less一些东西? 这是我的脚本:

#cleanup $max = $sheet.UsedRange.Rows.Count for ($i = 6; $i -le $max; $i++) { if ($sheet.Cells.Item($i, 1).Text -eq "") { $Range = $sheet.Cells.Item($i, 1).EntireRow $Range.Delete() } } 

更新:为了解决删除问题,我添加$ i = $ i – 1 ..现在我必须find一种方法来停止循环

  for ($i = 6; $i -le $row; $i++) { If ($Sheet.Cells.Item($i, 1).text -eq "") { $Range = $Sheet.Cells.Item($i, 1).EntireRow [void]$Range.Delete() $i = $i - 1 } } 

如果您正在删除“forward”循环中的行,则每次删除行时都会跳过一行。 如果行n被删除,则前一行n + 1现在变成行n。 但是,由于索引自动递增,因此在下一次迭代中,您将转到新的第n + 1行(前一行n + 2),从而跳过前一行n + 1(新的第n行)。

例:

考虑有这样一个表(第一列是行号):

  ┌──────────
 1│A
   ├──────────
 2│B
   ├──────────
 3 C
   ├────────── 

和这样的for循环:

 for ($i=1; $i -le 2; $i++) { $sheet.Rows.Item($i).Delete() } 

在第一次迭代$i的值为1,所以它指向第1行:

  ┏━━━━━━━━━━
 1┃A
   ┡━━━━━━━━━━
 2│B
   ├──────────
 3 C
   ├────────── 

通过删除该行,随后的行向上移动,所以表变成这样(在第一次迭代结束时):

  ┌──────────
 1│B
   ├──────────
 2│C
   ├────────── 

第二排现在已经成为第一排。 但是,当进入下一次迭代时,variables$i递增为2,所以现在指向第2行(前三行):

  ┌──────────
 1│B←跳过了这一行
   ┢━━━━━━━━━━
 2┃C
   ┡━━━━━━━━━━ 

从底部开始,您可以回到最前面来避免这种影响:

 $max = $sheet.UsedRange.Rows.Count for ($i = $max; $i -ge 6; $i--) { if ($sheet.Cells.Item($i, 1).Text -eq '') { $Range = $sheet.Rows.Item($i).Delete() } } 

请注意.UsedRange.Rows.Count不一定会给你最后一行的编号。 如果在第一个使用的行之前有空行,则需要将其数字作为偏移量添加到所使用的范围中的行数:

 $max = $sheet.UsedRange.Rows.Count + $sheet.UsedRange.Row - 1 

为了解决上述问题,我使用了一个反向循环,而不是一个前向循环..谢谢@RonRosenfeld的想法.. @AnsgarWiechers给了一个非常有见地的解释,为什么不适合使用一个前向循环。 他的回答只需要一点点调整。 设置$ i -ge 6对于反向循环来说仍然不是保证的终点。 要停止循环,我添加了一个else语句,当$ Sheet.Cells.Item($ i,1).text不再等于“null”时,它将设置$ i = 0。这将结束后向循环。

  #cleanup $max = $sheet.UsedRange.Rows.Count for ($i = $max; $i -ge 0; $i--) { If ($Sheet.Cells.Item($i, 1).text -eq "") { $Range = $Sheet.Cells.Item($i, 1).EntireRow [void]$Range.Delete() echo $i } Else {$i = 0} }