爲您節省大量時間的解決方案是從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"}
但是,你再添加一個名爲「$鍵」另一個變量。這與$data
不一樣嗎?或者當你寫$data
時,你的意思是$value
?我建議你堅持使用$data
或$key
作爲詞典鍵,但不能同時使用兩者。
編輯:根據我們在評論中討論的內容更改了代碼。
感謝您寶貴的時間在這裏給出這樣好的解釋。只是有人注意到,PowerShell中的「<」符號是「-lt」。在我嘗試了'$ get = @ {「$ data」=「value」} for($ i = 2; $ i -lt $ rowMax; $ i ++){ $ data = $ sheet.Cells.Item($我,2).text }'**輸出什麼也沒有顯示。我可以知道我在代碼中輸入了哪個錯誤嗎?請,謝謝... ** – DDC
是的,我也注意到了,oops^- ^輸出沒有顯示任何內容的原因是您沒有添加任何內容輸出。在發佈之後,在'for'循環中,嘗試在新行添加'$ data'。這將輸出你想要的,希望。 –
如果你想添加到字典中,你可以寫下這行:'$ get [$ data] = $ sheet.Cells.Item($ i,1).text'。這應該將所有內容都添加到字典中,並且可以通過在腳本的最後寫入'$ get'來在'for'循環之外輸出它。 –