在Excel中查找值并打印它

时间:2014-09-10 21:07:36

标签: excel powershell

我再次陷入PowerShell困境。 这是我的场景: 我有一张带有报告的Excel表格。在excel文件中有两行我正在寻找

错误总数= 0

致命错误总数= 0

这两行的问题在于"错误"之后的空格。可能会因报告而异。另一个问题是错误的数量(在这种情况下为0)在同一个单元格中。

我尝试做的是找到这两行并返回错误数。 这是我的代码到目前为止的样子。我知道它缺少一些东西,也没有工作。我尝试了很多正则表达式而没有运气。

任何帮助将不胜感激。

提前谢谢大家。

$File = "C:\test\setup.xlsx"
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.UsedRange
$Keywords="fatal errors", "errors"
$Filter = "Total number of"+ ($(($Keywords|%{[RegEx]::Escape($_)}) -join "|"))
$Search = $Range.find($Filter)
IF($Search -match '\d[0]')
    {
    "No Errors found"
    "No fatal errors found"
    }
ELSE
    {
    "number of errors found = " $search
    "number of fatal errors found = " $search 
    }

1 个答案:

答案 0 :(得分:2)

所以我首先要说你的正则表达式正在寻找“总数的冒险错误”或“总错误数”,因为你的'of'后面没有空格。仅此一点就可以解决它。

"Total number of (?:fatal )?errors\s*=\s*(\d*)"

那是我将要使用的RegEx。在这里看到它

老实说,我不会依赖Excel来找到它。我告诉PowerShell找到它,这就是我要做的事情:

$File = "C:\test\setup.xlsx"
$Excel = New-Object -ComObject Excel.Application
$Excel.visible = $true
$Workbook = $Excel.workbooks.open($file)
$Worksheets = $Workbooks.worksheets
$Worksheet = $Workbook.Worksheets.Item(1)
$Range = $Worksheet.UsedRange
$Errors = 0
$FatalErrors = 0
$Range.cells.value2 | Where{$_ -match "Total number of (?:fatal )?errors\s*=\s*(\d*)"} | ForEach{
    Switch($Matches[0]){
        {$_ -like "*fatal*"}{$FatalErrors+=$Matches[1];continue}
        default{$Errors+=$Matches[1]}
    }
}

If($Errors -gt 0){
    "Number of errors found = " + $Errors
}else{
    "No errors found"
}

If($FatalErrors -gt 0){
    "Number of errors found = " + $FatalErrors
}else{
    "No fatal errors found"
}

结果(通过我设置的测试电子表格准确):

Number of errors found = 23
Number of errors found = 7

更改单元格值以在错误后有3个空格并将数字设置为2,并将致命错误设置为0.结果:

Number of errors found = 2
No fatal errors found

编辑:好的,所以如果您不熟悉,我可能会感到困惑。这是另一个循环,它的工作原理如下:

Switch(<array to loop through>){
    Condition  {Action if condition is true}
    Condition2 {Action if condition2 is true}
    default {Action to take if no conditions are true}
}

因此,在我们的例子中,我们有一个条件是检查Where语句中的单元格是否包含单词'fatal'。如果是这样,它会将匹配的文本添加到$ FatalErrors变量中。如果它没有致命的,那么它将转到Default并将匹配添加到$ Errors。匹配的文本是字符串末尾的数字。