【问题标题】:Powershell script returns only first value in Excel rangePowershell 脚本仅返回 Excel 范围内的第一个值
【发布时间】:2017-07-27 01:39:28
【问题描述】:

我在尝试读取 Excel 电子表格时遇到了一些错误。我正在尝试从B2 到B15 的单元格中读取值,但我只返回B2。

有人可以帮助修复我的代码,以便将所有正确的行都写为输出吗?请和谢谢...

Excel 表格

一个-n

PowerShell 代码

$objExcel = New-Object -ComObject Excel.Application
$workbook = $objExcel.Workbooks.Open("C:\administrator\Book1.xlsx")
$sheet = $workbook.Worksheets.Item("Sheet1")
$rowMax = ($sheet.UsedRange.Rows).count

$i = 2;
$data = $sheet.Cells.Item($i,2).text 
$get = @{"$data"="value"}

foreach ($Key in ($get.GetEnumerator()))  {
    $i++;
    $Key.name
}

输出

我只得到第一行输出 a,而不是预期的第 2-15 行的 14 行,输出为 a-n。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    可以为您节省大量时间的解决方案是从 Excel 导出到 CSV 文件,在 powershell 中您可以非常轻松地访问数据,并且您也可以非常轻松地对其进行操作。看起来你的数据不是很复杂,所以我强烈建议你这样做。但是,这是您现在拥有它的方式的解决方案:

    不过,这是代码中的第一个问题。如您所见,$i 在这一行中定义:

    $i = 2;
    

    在你的for 循环中,你写:

    foreach ($Key in ($get.GetEnumerator()))  {
        $i++;
        $Key.name
    }
    

    请注意,这有点令人困惑。通常,for循环要么是基于迭代器的(就像你的那样,使用in),或者它们是基于范围的,使用通用范围迭代器$i。在您的情况下, $i 是一个迭代器,但在循环外用于从您的工作表中获取数据。这不应该是这样。因此,解决方案是将循环之外的一些行放入循环中:

    $i = 2;
    $get = @{"$data"="value"}
    foreach ($Key in ($get.GetEnumerator()))  {
        $data = $sheet.Cells.Item($i,2).text 
        $i++;
        $Key.name
    }
    

    很遗憾,试过之后发现$get.GetEnumerator是一本只有一行的字典!从上面定义的方式来看,这应该很明显,我想我们都错过了。这就解释了为什么您的代码只运行一次,而不是运行更多次,而是只返回第一行(这是我之前所期望的)。

    解决方案是您应该将 for 循环更改为基于范围。您已经为此定义了所需的变量,如rowMax。这是你所有的代码:

    $objExcel = New-Object -ComObject Excel.Application
    $workbook = $objExcel.Workbooks.Open("C:\administrator\Book1.xlsx")
    $sheet = $workbook.Worksheets.Item("Sheet1")
    $rowMax = ($sheet.UsedRange.Rows).count
    
    $get = @{"$data"="value"}
    
    for ($i = 2; $i -le $rowMax; $i++)  {
        $data = $sheet.Cells.Item($i + 1, 2).text 
    
        $get[$data] = $sheet.Cells.Item($i + 1, 1).text
    }
    

    在字典$get 中,$data 是您的密钥,根据:

    $get = @{"$data"="value"}
    

    但是,您随后添加了另一个名为“$key”的变量。这和$data不一样吗?或者当你写$data时,你的意思是$value吗?我建议你坚持使用$data 或$key 作为字典键,但不能同时使用。

    编辑:根据我们在 cmets 中讨论的内容更改了代码。

    【讨论】:

    • 感谢您宝贵的时间在这里给出如此好的解释。只是有些人注意到,powershell 中的“$get = @{"$data"="value"} for ($i = 2; $i -lt $rowMax; $i++) { $data = $sheet.Cells.Item($i,2).text } 后,输出什么也没有显示。请问我可以知道我在代码中输入的错误吗?请和谢谢...
    • 是的,我也注意到了,哎呀 ^-^ 输出没有显示任何内容的原因是您没有在输出中添加任何内容。在您发布的那个之后,在for 循环内,尝试在新行上仅添加$data。希望这会输出你想要的。
    • 如果你想添加到字典中,你可以写这行:$get[$data] = $sheet.Cells.Item($i,1).text。这应该将所有内容添加到字典中,并且您可以通过在脚本的最后写入 $get 将其输出到 for 循环之外。
    • 非常感谢!输出相应地显示 a - l。但是,我的 excel 表是 a - n。我可以知道读取数据是否有限制...?还是我在某些部分写错的代码? $get = @{"$data"="value"} for ($i = 2; $i -lt $rowMax; $i++) { $data = $sheet.Cells.Item($i,2).text $data; } 请真的谢谢....
    • 感谢您抽出宝贵时间回答我的问题。代码有效!我赞成你的帖子。 ^.^ 感谢您的反馈!声望低于 15 人的投票会被记录,但不会更改公开显示的帖子分数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多