我创建了以下函数,它将数组的值导出到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 :(得分: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。我很确定这是你的意图。
答案 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)