Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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
用于匹配excel单元格值条件的Powershell脚本_Excel_Powershell - Fatal编程技术网

用于匹配excel单元格值条件的Powershell脚本

用于匹配excel单元格值条件的Powershell脚本,excel,powershell,Excel,Powershell,我是powershell的新手程序员,我正在尝试做excel搜索和更改格式和字体选项。下面是我试图搜索单词“PASSED”并将颜色更改为绿色和粗体的代码片段,目前代码确实在未按预期更改的情况下退出,这其中有什么错误我无法理解,需要这方面的帮助 $excel = New-Object -ComObject Excel.Application $excel.Visible = $false $excel.DisplayAlerts = $False $workbook =

我是powershell的新手程序员,我正在尝试做excel搜索和更改格式和字体选项。下面是我试图搜索单词“PASSED”并将颜色更改为绿色和粗体的代码片段,目前代码确实在未按预期更改的情况下退出,这其中有什么错误我无法理解,需要这方面的帮助

  $excel = New-Object -ComObject Excel.Application
    $excel.Visible = $false
    $excel.DisplayAlerts = $False
    $workbook = $excel.Workbooks.Open("C:\test.xlsx")
    $sheet = $workbook.ActiveSheet

    $xlCellTypeLastCell = 11

    $used = $sheet.usedRange 
    $lastCell = $used.SpecialCells($xlCellTypeLastCell) 
    $row = $lastCell.row # goes to the last used row in the worksheet

    for ($i = 1; $i -lt $row.length; $i++) {
    If ($sheet.cells.Item(1,2).Value() = "PASSED") {
            $sheet.Cells.Item(1,$i+1).Font.ColorIndex = 10
            $sheet.Cells.Item(1,$i+1).Font.Bold = $true
              }
    }

    $workbook.SaveAs("C:\output.xlsx")
    $workbook.Close()
输入(test.xlsx)文件具有以下内容

Module | test | Status
ABC      a      PASSED

它是一个巨大的文件,每个单元测试的状态都不同。

$row
是一个包含最后一行号的字符串,与
for
循环中的
Length
属性相比,它会给您带来麻烦,因为它会给出字符串本身的长度

将其更改为:

for ($i = 1; $i -lt $row; $i++) {
在循环中的
if
语句中,还有另一个问题:
=

为了比较两个值是否相等,请使用
-eq
运算符而不是
=
=
仅用于赋值):

最后,Excel单元格引用不是基于零的,因此
项(1,2)
将引用示例中具有值“test”的单元格(注意它如何将行作为第一个参数,将列作为第二个参数)。将其更改为
项(2,3)
以针对正确的单元格进行测试,并在if块内转置单元格坐标

您可能需要更新
for
循环以反映这一点:

for ($i = 2; $i -le $row; $i++) {
    if ($sheet.cells.Item($i,3).Value() = "PASSED") {
        $sheet.Cells.Item($i,3).Font.ColorIndex = 10
        $sheet.Cells.Item($i,3).Font.Bold = $true
    }
}

另外,
Value
是一个属性而不是一个方法,您应该删除
()
,即使在添加了-eq之后,正如前面提到的,它也不起作用。没有导致代码调试困难的错误,请您解释一下为什么它不起作用,并提供合适的解决方案。是的,我应该看到for循环,你的建议奏效了。谢谢
for ($i = 2; $i -le $row; $i++) {
    if ($sheet.cells.Item($i,3).Value() = "PASSED") {
        $sheet.Cells.Item($i,3).Font.ColorIndex = 10
        $sheet.Cells.Item($i,3).Font.Bold = $true
    }
}