可以为您节省大量时间的解决方案是从 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 中讨论的内容更改了代码。