Powershell脚本仅返回Excel范围中的第一个值

时间:2017-07-27 01:39:28

标签: powershell

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

有人可以帮我修复我的代码,以便所有正确的行都可以写成输出吗?拜托,谢谢......

Excel表格

一个正

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

1 个答案:

答案 0 :(得分:2)

可以节省大量时间的解决方案是从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作为字典键,但不能同时使用两者。

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