Powershell Excel 从数组中添加行

Powershell Excel Add row from array

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

我如何通过使用 Value2 将每个数组 object 传递给它来更新 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 post 看起来与我正在尝试做的相似,但我没有使用 activesheet,无法让它工作。

谢谢大家

我猜您希望插入所有用户 object,并且假设您一次只能做一行,因为这比一次做一个单元格更好。让我们一次做整个数组,你说呢?你没有给我们一些需要的信息,所以我会弥补我还没有的。显然您想使用由 $SPREADSHEET_WORKSHEET_2 表示的作品 sheet,我们可以使用它。由于您发布的代码应该将属性名称作为 header 行输入,因此我假设您实际上确实想要 header 行,这很好,因为我们将默认粘贴一个(跳过会变得有点复杂,但我离题了)。我将使用 $arrUsers 作为你的数组变量名,因为你没有指定一个(我假设 $obj 是数组中的一个 object)。那么,让我们这样做...

我们将在单元格 A1 中粘贴包含 object 行的 header 行。粘贴到 Excel 时,您希望内容以制表符分隔,我们可以使用 ConvertTo-CSV -delimeter "t"and we will also use the-NoTypeInformation` 开关轻松完成同一 cmdlet,这样它就不会插入object 类型信息作为第一行,只给我们 header 和记录。我们将通过管道传输到 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()

完成。不,真的,就是这样。这会将带有 headers 的整个数组粘贴到单元格 A1 中所需的 sheet。

好的,这实际上并没有直接回答您的问题,但我认为这就是您想要的。为了直接回答您的问题,我将告诉您如何一次填充整行的值。基本上它是同一件事,但我们只从数组中 select 一个 object,并且还在我们管道到 clip 之前添加 |select -skip 1 以便它跳过 header 行.

$arrUsers[20] | ConvertTo-CSV -NoType -Del "`t" | Select -Skip 1 | Clip
[void]$SPREADSHEET_WORKSHEET_2.cells.Item(1).PasteSpecial()

即把第21条用户的记录粘贴到A1中。你不想要A1?好吧,这是可以管理的,假设您想要 A22(第 21 个用户,加上 header 行,这在我看来很有意义)。我们可以做到:

[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 object 是我们想要使用的 PasteSpecial 方法。没有参数,它就像通用粘贴一样工作。 WorkSheet object 确实有一个 Paste 方法,但是它脱离了当前 selected 的单元格,从你说话的方式来看,你真的不想那样做。这使您可以指定一个单元格并直接粘贴到它。