【发布时间】:2012-12-17 19:13:41
【问题描述】:
我有一个包含数千个条目的 xlsx 文件 我可以使用 $workbook.AutoFilter("DATA") 在一秒钟内过滤一列以仅显示某些信息
这个过滤器只需要一秒钟,但是删除第一列 = "DATA" 的所有行需要永远循环。
有没有办法捕获隐藏行或范围的数组...或任何我可以 .DELETE()
我试过了
[void] [Reflection.Assembly]::LoadWithPartialName( 'System.Windows.Forms' )
$Excel = New-Object -Com Excel.Application
$WorkBook = $Excel.Workbooks.Open($filename)
$Excel.visible = $true
$Excel.selection.autofilter(1,"DATA")
$sheet = $workbook.Sheets.Item(1)
$max = $sheet.UsedRange.Rows.Count
for ($i=2; $i -le $max; $i++)
{
$row = $sheet.Cells.Item($i,1).EntireRow
if ($row.hidden -eq $false)
{
$row.Delete()
}
}
已修复.. 向后循环 $i-- * 然而,这让我很失望,因为由于某种原因,它留下了大约 10% 的可见行未删除。如果我运行它两次,它可以工作,但是扩大规模这将成为一个更大的问题。
在一个完美的世界里,我想要这样的东西
$Excel.selection.autofilter(1,"DATA").DELETE()
在此先感谢各位天才提供的任何提示或技巧。
更新:谢谢 Graimer,你说得对,我必须在其他方向循环,这仍然需要相当长的时间,有 10,000 多个条目......我正在寻找一种方法来做到这一点手动循环。
如果我去 $Excel.visible = $true, 然后 $Excel.selection.autofilter(1,"DATA")... 那么作为用户我 ctrl+A 并删除选定的行...它更快手动然后循环过程......我不禁认为必须有某种方法来编写该动作的脚本。
【问题讨论】:
-
这不会加快速度,但是您是否尝试过反转 for 循环?至少在我的大脑中,当您删除第 1 行时,所有其他人都会跳上一级 = 有一个新的第 1 行)。所以要删除所有内容,你从
$max开始,然后使用$i--一路向下,只要$i > 1或其他任何东西
标签: excel powershell