Powershell Excel从数组中添加行

问题描述:

我知道如何通过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

我猜你想插入的所有用户对象,并假设你只能做一次的行,因为那会比一次一个小区好。让我们一次完成整个阵列,你说什么?你不会给我们一些需要的信息,所以我会弥补我没有的信息。很明显,你想使用$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