我知道如何通过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帖子看起来与我尝试过的内容类似,但我没有使用活动表,也无法让它发挥作用。
全部谢谢
答案 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对象确实有一个粘贴方法,但它离开当前选定的单元格,从你说话的方式来看,听起来你真的不想这样做。这允许您指定一个单元格并直接粘贴到它。