我在尝试阅读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
。
答案 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
作为字典键,但不能同时使用两者。
编辑:根据我们在评论中讨论的内容更改了代码。