Arrays 数组到Excel范围仅给出数组的第一个元素
我创建了以下函数,它将数组的值导出到Excel,但它只导出第一个元素Arrays 数组到Excel范围仅给出数组的第一个元素,arrays,excel,powershell,Arrays,Excel,Powershell,我创建了以下函数,它将数组的值导出到Excel,但它只导出第一个元素 函数导出\u Excel($Array、$Column、$Sheet){ [System.Threading.Thread]::CurrentThread.CurrentCulture=“en-US” [System.Threading.Thread]::CurrentThread.CurrentUICulture=“en-US” $Global:sheet=$Global:wkbk.WorkSheets.Item(“$she
函数导出\u 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\u Excel$Array“B”Sheet1
对于整个数组长度,它只导出每个单元格中的第一个元素。有人知道我做错了什么吗?值是按行分配的,而不是按列分配的。改为使用循环: ($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)
这只是一个字符串数组吗?如果是这样的话,这可以做得简单得多。将每个字符串转换为对象,将对象数组转换为不包含类型信息的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单元格,用单词Orange填充F4单元格,用单词Banana填充F5单元格。我很确定那是你的意图。
以防万一,在我测试时,我们还需要知道$array是如何声明的<代码>$Array=@()?您好,Matt,当我使用Export_Excel$Array“3”“Sheet1”时,$Array实际上被声明为$Array=@()。数组被“正确”导出后,您就拥有第33行中的所有信息。唯一的问题是,数组中的元素将超过100.000个。因此,循环将需要很长时间,转置将不可能。有什么方法可以在列而不是行中分配值吗?如果你有100000行或更多行,你首先不应该使用Excel。我知道,但这是管理层的要求。For循环可以工作,但速度非常慢。如果我可以将数组放在一列中,那么它将在50倍的时间内完成。您可以使用复制/粘贴转置的方法将数组分成几千个元素的块(
$array[0..15000]
,$array[15001..30000]
,…)来处理。我必须同意这里的操作。。。使用excelcomobject在单元格中循环并设置其值的速度惊人地慢。出色地使用了特殊的转置功能!这真是太棒了=)这很有魅力。非常感谢你。现在将数组导出到Excel只需要不到一秒钟的时间。CovertTo Csv的唯一问题是,如果数组字符串中有“é,ô,ö,á,è,…”,它将删除这些字符并将其更改为??。使用swithc编码UTF8不会改变这一点