数组到Excel范围只给出数组的第一个元素

我已经创build了下面的函数,它将数组的值导出到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" 

它会为数组的整个长度仅导出每个单元格中的第一个元素。 任何人都可以看到我做错了什么?

这只是一个string数组? 如果是这样,这可以做得更简单。 将每个string转换为一个对象,将对象数组转换为一个没有types信息的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() } 

噢,对了,我把列信转换成数字等价的。 所以,要testing这个…

 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,创build一个空白的工作簿,然后用单词Apple填充单元格F3,用单词Orange填充单元格F4,用单词Banana填充单元格F5。 我很确定这是你的意图。 在这里输入图像说明

这些值分配在行中,而不是列。 改用循环:

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

请注意,您需要为此创build$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)