我猜您希望插入所有用户对象,并假设您一次只能执行一行,因为这比一次一个单元格要好。让我们一次做整个数组,你说什么?你没有给我们一些需要的信息,所以我会弥补我还没有的。显然您想使用由$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()
这是第一行,也是该行中的第 22 个单元格。或者你可以像以前一样使用 Range 方法:
[void]$SPREADSHEET_WORKSHEET_2.Range("A22").cells.Item(1).PasteSpecial()
同样的事情。在我走之前这里只是最后的评论......
我们经常使用.cells.item(1),因为 Cell 对象具有我们想要使用的 PasteSpecial 方法。没有参数,它就像一个通用的粘贴一样工作。 WorkSheet 对象确实有一个 Paste 方法,但这会在当前选定的单元格中消失,从您说话的方式来看,您似乎真的不想这样做。这使您可以指定一个单元格并直接粘贴到它。