2015-05-20 49 views
1

我已经创建了以下函数,它将数组的值导出到Excel,但它只导出第一个元素。Array to 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" 

它导出对每个小区中的阵列仅在第一元件的整个长度。任何人都可以看到我在做什么错了吗?

+0

以防万一我测试我时我们需要知道$ array是如何声明的。 '$ Array = @()'? – Matt

+0

您好Matt,确实$ Array被声明为$ Array = @() – user1000584

+0

当我使用 Export_Excel $ Array“3”“Sheet1” 该数组已导出'正确',则您拥有第33行上的所有信息。 – user1000584

回答

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中打开,创建一个空白工作簿,然后填充细胞F3字苹果,细胞F4字Orange和细胞F5字香蕉。我很肯定这是你的意图。 enter image description here

+0

这就像一个魅力。非常感谢你。 现在将数组导出到Excel的时间不到一秒钟。 – user1000584

+0

CovertTo-Csv唯一的问题是,如果你的数组字符串中有“é,ô,ö,à,è,...”,它将删除这些字符并将其更改为??。使用swithc -encoding UTF8不会改变这一点 – user1000584

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) 
+0

唯一的问题是将会有超过100.000个元素的阵列。 因此,循环将需要很长时间,转置将不可能。 有什么办法来分配列中的值而不是行吗? – user1000584

+0

如果您有100000行或更多行,您不应该首先使用Excel。 –

+0

我知道,但这是管理层的要求。 For Loop有效,但速度很慢。 如果我可以在列中放入数组,它将在50倍的时间内完成。 – user1000584

相关问题