Array to Excel Range仅提供Array的第一个元素

时间:2015-05-20 09:28:50

标签: arrays excel powershell

我创建了以下函数,它将数组的值导出到Excel,但它只导出第一个元素。

Function Export_Excel ($Array,$Column,$Sheet) {
  [System.Threading.Thread]::CurrentThread.CurrentCulture = "en-US"
  [System.Threading.Thread]::CurrentThread.CurrentUICulture = "en-US"

  $Global:sheet = $Global:wkbk.WorkSheets.Item("$Sheet")
  $intRow = 3

  $LastRow = $Array.count + 2
  $Range = "$Column" + $intRow +":$Column" + "$LastRow"

  $RangeSet = $Global:sheet.Range("$Range")
  $RangeSet.Value2 = $Array

  [gc]::collect()
  [gc]::WaitForPendingFinalizers() 
  [System.Threading.Thread]::CurrentThread.CurrentCulture = $Global:OldCulture
  [System.Threading.Thread]::CurrentThread.CurrentUICulture = $Global:OldUICulture
}

我的数组是使用$Array+=$ValueForArray生成的。

执行时

Export_Excel $Array "B" "Sheet1"

它只为每个单元格中的第一个元素导出数组的整个长度。谁能看到我做错了什么?

2 个答案:

答案 0 :(得分:2)

这只是一个字符串数组吗?如果是这样,这可以这样更简单。将每个字符串转换为一个对象,将对象数组转换为没有类型信息的CSV,并使其以制表符分隔,跳过标题行,复制到剪贴板,粘贴到您希望它从哪里流下来。如果你真的想把它作为一个函数,你可以这样做:

Function Export_Excel ($Array,[String]$Column,[String]$Sheet) {
    $ColNum = ([int][char]$Column.ToUpper()) - 64
    $Array | Select @{n='Header';e={$_}} | ConvertTo-Csv -NoTypeInformation -Delimiter "`t" | Select -Skip 1 | clip
    [void]$Wkbk.WorkSheets.Item("Sheet1").Columns.Item($ColNum).Cells.Item(3).PasteSpecial()
}

哦,是的,我把列字母也转换成了它的数字等价物。所以,要测试一下......

Function Export_Excel ($Array,[String]$Column,[String]$Sheet) {
    $ColNum = ([int][char]$Column.ToUpper()) - 64
    $Array | Select @{n='Header';e={$_}} | ConvertTo-Csv -NoTypeInformation -Delimiter "`t" | Select -Skip 1 | clip
    [void]$Wkbk.WorkSheets.Item("Sheet1").Columns.Item($ColNum).Cells.Item(3).PasteSpecial()
}

$Excel = New-Object -ComObject Excel.Application
$Excel.Visible = $True
$Wkbk = $Excel.Workbooks.Add()

$Fruit = @("Apple","Orange","Banana")

Export_Excel $Fruit 'f' 'Sheet1'

结果:Excel打开,创建了一个空白工作簿,然后使用单词Apple填充单元格F3,单词F4填充单词Orange,单元格F5填充单词Banana。我很确定这是你的意图。 enter image description here

答案 1 :(得分:1)

值按行分配,而不是列。改为使用循环:

for ($i = 0; $i -lt $Array.Length; $i++) {
  $global:sheet.Cells.Item($i+3, $Column).Value2 = $Array[$i]
}

请注意,您需要为此$Column设置一个数字参数。

作为替代方案,您可以将数组放在临时表上的一行中,然后在转置值时复制/粘贴该范围:

$temprange = "A1:" + [string][char]($Array.Length + 64) + "1"
$range     = "$Column${intRow}:$Column$LastRow"

$global:tempsheet.Range($temprange).Value2 = $Array
[void]$global:tempsheet.Range($temprange).Copy()
[void]$global:sheet.Range($range).PasteSpecial(-4163, -4142, $false, $true)