Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 数组到Excel范围仅给出数组的第一个元素_Arrays_Excel_Powershell - Fatal编程技术网

Arrays 数组到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

我创建了以下函数,它将数组的值导出到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(“$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不会改变这一点