2015-04-06 50 views
0

我知道如何通過COM對象逐個單元格更新Excel speadsheet,但速度非常慢。我有一個包含約15個屬性(字符串或布爾值)的大約600個對象(用戶詳細信息)的pscustomobject數組。Powershell Excel從數組中添加行

如何使用Value2將每個數組對象傳遞給Excel來更新Excel中的一行?有人可以粘貼一個傳遞數組和更新整行的工作示例嗎?以下代碼適用於第一行(標題),但未更新行。

$obj_fields = $obj | Get-Member | ?{$_.membertype -eq 'noteproperty'} 
$alpha_column = [char]($obj_fields.count + 96) 

If ($row -eq 2) { 
    #heading 
    $range = $SPREADSHEET_WORKSHEET_2.cells.Item(1,1).range("a1`:$($alpha_column)1") 
    $range.Value2 = $obj_fields.Name 
} 
#values 
$range = $SPREADSHEET_WORKSHEET_2.cells.Item($row,1).range("a$row`:$alpha_column$row") 
$tmp = ($obj_fields | %{$obj."$_"}) 
$range.Value2 = $tmp 

This後類似於我想要做的,但我不使用activesheet並不能得到它的工作。

感謝所有

+0

你想只粘貼一行嗎?或者你想要將所有600個對象粘貼爲一個數組? – TheMadTechnician

回答

1

我猜你想插入的所有用戶對象,並假設你只能做一次的行,因爲那會比一次一個小區好。讓我們一次完成整個陣列,你說什麼?你不會給我們一些需要的信息,所以我會彌補我沒有的信息。很明顯,你想使用$SPREADSHEET_WORKSHEET_2表示的工作表,這很好,我們可以用這個工作表。由於您發佈的代碼應該將屬性的名稱作爲標題行輸入,因此我認爲您確實需要標題行,這很好,因爲我們將默認粘貼一個(跳過這會變得更復雜一點,但我離題了)。我將使用$arrUsers作爲數組變量名稱,因爲您沒有指定一個(我假設$obj是數組中的一個對象)。所以,讓我們這樣做...

我們將在單元格A1上粘貼具有標題行的對象數組。當粘貼到Excel時,您希望事物被製表符分隔,我們可以輕鬆地使用ConvertTo-CSV -delimeter " t「and we will also use the -NoTypeInformation」切換該相同的cmdlet,以便它不會將對象類型信息作爲第一行插入, (如果你的PowerShell不喜歡管道到剪輯,你可以管道到c:\ windows \ system32 \ clip.exe,而不是基本上插入到你的剪貼板的東西,這是真棒目的)。

#Convert array of object to a CSV that is tab delimited and without object type information, and copy it to the clipboard 
$arrUsers | ConvertTo-CSV -Delimeter "`t" -NoType | Clip 

#Select the first cell of the desired sheet and activate it's PasteSpecial method with no arguments (typing it as `[void]` so we don't get "True" spam because it was successful) 
[void]$SPREADSHEET_WORKSHEET_2.cells.Item(1).PasteSpecial() 

完成。不,真的,就是這樣。這將與頭到您的工作簿的希望的紙頁整個陣列粘貼在單元格A1。

好了,日在實際上並沒有直接回答你的問題,但我認爲這是你想要的。要直接回答你的問題,我會告訴你如何一次填充整行的價值。基本上它是一樣的,但我們只從數組中選擇一個對象,並且在我們管道剪輯之前添加|select -skip 1,以便它跳過標題行。

$arrUsers[20] | ConvertTo-CSV -NoType -Del "`t" | Select -Skip 1 | Clip 
[void]$SPREADSHEET_WORKSHEET_2.cells.Item(1).PasteSpecial() 

將第21位用戶的記錄粘貼到A1中。你不想要A1?那麼,這是可管理的,假設你想要A22(第21位用戶,加上標題行,這在我的腦海中是有道理的)。我們可以這樣做:

[void]$SPREADSHEET_WORKSHEET_2.columns.Item(1).cells.item(22).PasteSpecial() 

這是第一行,也是第22行。或者你可以像以前一樣使用Range方法:

[void]$SPREADSHEET_WORKSHEET_2.Range("A22").cells.Item(1).PasteSpecial() 

同樣的事情。在我走之前,只是最後的評論...

我們經常使用.cells.item(1),因爲Cell對象是我們想要使用的PasteSpecial方法。沒有參數,它就像通用的粘貼一樣。 WorkSheet對象確實有一個Paste方法,但是它離開了當前選中的單元格,而且從你說話的方式來看,你聽起來好像你不想這樣做。這使您可以指定一個單元格並直接粘貼到它。

+0

感謝您的詳細回覆 - 提到的幾點正是我所需要的,並且解釋非常有幫助。你的假設也是現貨。你的解釋使我能夠做我需要做的事 - 而且你對粘貼整個陣列是正確的 - 這麼簡單,快得多。再次感謝。 – kr0me