Powershell Excel从数组中添加行
我知道如何通过一个COM对象来逐个更新Excel的电子表格,但是速度非常慢。 我有一个包含约15个属性(string或布尔值)的大约600个对象(用户详细信息)的pscustomobject数组。
我怎么会更新Excel中的行,通过使用Value2将每个数组对象传递给它? 有人可以粘贴一个传递数组和更新整行的工作示例? 以下代码适用于第一行(标题),但不更新行。
$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
这篇文章看起来类似于我正在做的,但我没有使用activesheet,并不能得到它的工作。
谢谢大家
我猜你想要插入所有的用户对象,并且假设你一次只能做一行,因为那样会比一次更好。 让我们一起做整个arrays吧,你说什么? 你不给我们一些需要的信息,所以我会弥补我没有的东西。 显然,你想使用由$SPREADSHEET_WORKSHEET_2
表示的工作表,这很好,我们可以使用。 既然你发布的代码,假设input属性的名称作为标题行,我假设你确实需要一个标题行,这是很好的,因为我们将默认粘贴一个(跳过,得到一点点复杂,但我离题了)。 我打算使用$arrUsers
作为你的数组variables名,因为你没有指定一个(我假设$obj
是数组中的一个对象)。 所以,我们来做这个…
我们将在单元格A1上粘贴具有标题行的对象数组。 当粘贴到Excel时,您希望事物被制表符分隔,我们可以使用ConvertTo-CSV -delimeter "
t”轻松完成这个操作, and we will also use the
同一个cmdlet and we will also use the
-NoTypeInformation`开关,以便它不插入对象键入信息作为第一行,只是给我们的头和logging。 我们将pipe道剪辑(如果你的PowerShell不喜欢pipe道剪辑,你可以pipe到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一个对象,并且在我们pipe道剪辑之前添加|select -skip 1
,以便跳过标题行。
$arrUsers[20] | ConvertTo-CSV -NoType -Del "`t" | Select -Skip 1 | Clip [void]$SPREADSHEET_WORKSHEET_2.cells.Item(1).PasteSpecial()
将第21位用户的logging粘贴到A1中。 你不想要A1? 那么,这是可pipe理的,假设你想要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方法,但是它会从当前选中的单元格中移除,并且从你说话的方式来看,这听起来像是你不想这么做。 这使您可以指定一个单元格并直接粘贴到它。