2017-07-27 85 views
1

我在嘗試讀取Excel電子表格時遇到一些錯誤。我正在嘗試讀取單元格B2B15中的值,但我只能回到B2Powershell腳本僅返回Excel範圍中的第一個值

有人可以幫助修復我的代碼,以便所有正確的行可以寫爲輸出嗎?請和謝謝...

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

回答

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"} 

但是,你再添加一個名爲「$鍵」另一個變量。這與$data不一樣嗎?或者當你寫$data時,你的意思是$value?我建議你堅持使用$data$key作爲詞典鍵,但不能同時使用兩者。

編輯:根據我們在評論中討論的內容更改了代碼。

+0

感謝您寶貴的時間在這裏給出這樣好的解釋。只是有人注意到,PowerShell中的「<」符號是「-lt」。在我嘗試了'$ get = @ {「$ data」=「value」} for($ i = 2; $ i -lt $ rowMax; $ i ++){ $ data = $ sheet.Cells.Item($我,2).text }'**輸出什麼也沒有顯示。我可以知道我在代碼中輸入了哪個錯誤嗎?請,謝謝... ** – DDC

+0

是的,我也注意到了,oops^- ^輸出沒有顯示任何內容的原因是您沒有添加任何內容輸出。在發佈之後,在'for'循環中,嘗試在新行添加'$ data'。這將輸出你想要的,希望。 –

+0

如果你想添加到字典中,你可以寫下這行:'$ get [$ data] = $ sheet.Cells.Item($ i,1).text'。這應該將所有內容都添加到字典中,並且可以通過在腳本的最後寫入'$ get'來在'for'循環之外輸出它。 –

相關問題