在Powershell中查找Excel文件的内容

时间:2015-05-12 20:35:37

标签: excel powershell

我目前正在开发一个相当大的PowerShell脚本。但是,我陷入了困境。问题如下。

我有各种报告,文件名相同,最后只有不同的时间戳。在报告中,我有一个字段显示报告来自何时的日期。

---> 2/1/2015 5:00:00 AM到3/1/2015 5:00:00 AM< ---这就是它的样子。

此字段随机放置在Excel工作表上。几乎在A5到Z16的范围内。我希望脚本能做的是:

阅读文件 / 检查日期的单元格范围,如果找到日期且符合我的搜索条件,请关闭工作表并移动它到另一个文件夹 / 如果日期不匹配,请关闭并检查下一个XLS文件

这是我到目前为止所得到的:

$File = "C:\test.XLS" 
$SheetName = "Sheet1"
# Setup Excel, open $File and set the the first worksheet
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$WorkSheet = $WorkBook.sheets.item($SheetName)
$SearchString = "AM" #just for test purposes since it is in every report
$Range = $Worksheet.Range("A1:Z1").EntireColumn
$Search = $Range.find($SearchString)

1 个答案:

答案 0 :(得分:6)

如果您希望它在整个列中搜索A到Z,您可以指定范围:

$Range = $Worksheet.Range("A:Z")

然后你应该能够执行一个$Range.Find($SearchText),如果找到文本,它会回吐它找到的第一个单元格,否则它什么也不返回。所以像你一样启动Excel,然后执行ForEach循环,在里面打开一个工作簿,搜索你的文本,如果发现它关闭它,移动它,停止循环。如果未找到,请关闭工作簿,然后移至下一个文件。以下工作对我来说很好:

$Destination = 'C:\Temp\Backup'
$SearchText = '3/23/2015  10:12:19 AM'
$Excel = New-Object -ComObject Excel.Application

$Files = Get-ChildItem "$env:USERPROFILE\Documents\*.xlsx" | Select -Expand FullName
$counter = 1
ForEach($File in $Files){
    Write-Progress -Activity "Checking: $file" -Status "File $counter of $($files.count)" -PercentComplete ($counter*100/$files.count)
    $Workbook = $Excel.Workbooks.Open($File)
    If($Workbook.Sheets.Item(1).Range("A:Z").Find($SearchText)){
        $Workbook.Close($false)
        Move-Item -Path $File -Destination $Destination
        "Moved $file to $destination"
        break
    }
    $workbook.close($false)
    $counter++
}

我甚至雄心勃勃地在那里添加了一个进度条,这样你就可以看到它有多少文件可能会被查看,它完成了多少,以及它当时正在查看的文件。

现在这一切都假设您确切知道该单元格中的字符串(至少是部分字符串)。如果你错了,那就不行了。检查不明确的事情需要更长的时间,因为您无法使用Excel的匹配功能,并且必须让PowerShell一次检查一个范围内的每个单元格。