Powershell Excel从数组中添加行

时间:2015-04-06 20:54:19

标签: arrays excel powershell row add

我知道如何通过COM对象逐个单元格更新Excel表格,但速度非常慢。我有一个包含大约600个对象(用户详细信息)的pscustomobject数组,其中包含15个属性(字符串或布尔值)。

如何通过使用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帖子看起来与我尝试过的内容类似,但我没有使用活动表,也无法让它发挥作用。

全部谢谢

1 个答案:

答案 0 :(得分:1)

我猜你想要插入所有用户对象,并假设你一次只能做一行,因为那样一次比一个单元更好。让我们立刻做整个阵列吧,你怎么说?你没有给我们提供一些所需要的信息,所以我会补充我已经没有的信息。显然你想使用$SPREADSHEET_WORKSHEET_2所代表的工作表,我们可以使用它。由于您发布的代码应该输入属性的名称作为标题行,我假设您确实需要标题行,这很好,因为我们将默认粘贴一个(跳过它会变得更复杂,但是我离题了。我将使用$arrUsers作为您的数组变量名,因为您没有指定一个(我假设$obj是数组中的一个对象)。所以,让我们这样做......

我们将在单元格A1处粘贴标题行的对象数组。粘贴到Excel时,您希望事物以制表符分隔,我们可以使用ConvertTo-CSV -delimeter " t" and we will also use the - NoTypeInformation`切换该相同的cmdlet,以便它不会插入对象类型信息作为第一行,只给我们标题和记录。我们将管道到Clip(如果您的PowerShell不想管道到Clip,你可以管道到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()

那是第一行,第二行是第二行。或者您可以像以前一样使用Range方法:

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

同样的事情。在我走之前,这是最后的评论...

我们经常使用.cells.item(1)因为Cell对象是我们想要使用的PasteSpecial方法。没有参数,它就像通用粘贴一样工作。 WorkSheet对象确实有一个粘贴方法,但它离开当前选定的单元格,从你说话的方式来看,听起来你真的不想这样做。这允许您指定一个单元格并直接粘贴到它。