【问题标题】:Powershell Excel Add row from arrayPowershell Excel从数组中添加行
【发布时间】:2015-06-11 08:06:20
【问题描述】:

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

如何通过使用 Value2 将每个数组对象传递给 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 帖子看起来与我正在尝试做的类似,但我没有使用 activesheet 并且无法使其正常工作。

谢谢大家

【问题讨论】:

  • 您只想粘贴一行?还是要将所有 600 个对象粘贴为一个数组?

标签: arrays excel powershell row add


【解决方案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()

这是第一行,也是该行中的第 22 个单元格。或者你可以像以前一样使用 Range 方法:

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

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

我们经常使用.cells.item(1),因为 Cell 对象具有我们想要使用的 PasteSpecial 方法。没有参数,它就像一个通用的粘贴一样工作。 WorkSheet 对象确实有一个 Paste 方法,但这会在当前选定的单元格中消失,从您说话的方式来看,您似乎真的不想这样做。这使您可以指定一个单元格并直接粘贴到它。

【讨论】:

  • 感谢您提供如此详细的回复 - 提到的要点正是我所需要的,并且解释非常有帮助。你的假设也是正确的。您的解释使我能够做我需要做的事情——而且你对粘贴整个数组是正确的——如此简单而且更快。再次感谢。
猜你喜欢
  • 2018-06-29
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
  • 2014-08-24
  • 1970-01-01
相关资源
最近更新 更多