2014-08-29 108 views
0

我正在寫一個腳本,它在Excel文檔中導入大型csv文件。 我嘗試使用更快的方式輸入數據,並將數組直接傳遞給Excel而不循環。使用PowerShell將大型csv文件導入到Excel中

$p = Import-Csv -Path "C:\Report.csv" -Delimiter "`t" 
$Excel01 = New-Object -ComObject Excel.Application 
$Excel01.Visible = $True 
$Workbook01 = $Excel01.Workbooks.Add() 
$Worksheet01 = $Workbook01.Sheets.Item(1) 
$Worksheet01.Activate() 

$Worksheet01.Range("A1:D1").EntireColumn.Value() = $p | select field1,field2... 

但是,當我運行它它hungs ...我該怎麼做?

+1

在Excel中直接打開CSV文件有什麼問題? – 2014-08-29 07:14:59

+0

或使用從文本嚮導導入。 – 2014-08-29 07:27:58

+0

大衛布拉班特,我需要查詢SQL服務器的數據,並將其保存爲xlsx文件,並通過電子郵件發送(並重復這個東西幾次),這就是爲什麼我試圖自動執行這些操作。因此,我使用bcp命令行工具將數據從mssql導出到csv文件,然後我需要以某種方式將其轉換爲Excel格式。 – BIB 2014-08-29 07:31:10

回答

1

OpenText()在Excel中已經存在。但是,請注意,您必須將文本文件的擴展名更改爲.csv以外的其他名稱,因爲Excel對於如何處理具有該特定擴展名的文件有着自己的想法。

New-Variable -Option Constant -Name xlDelimited -Value 1 
New-Variable -Option Constant -Name xlTextQualifierNone -Value -4142 
New-Variable -Option Constant -Name xlWorkbookDefault -Value 51 

$csv = 'C:\path\to\your.csv' 
$txt = $csv -replace '\.csv$','.txt' 
$xls = $csv -replace '\.csv$','.xlsx' 

Rename-Item $csv $txt 

$xl = New-Object -COM 'Excel.Application' 
$xl.Workbooks.OpenText($txt, [Type]::Missing, [Type]::Missing, $xlDelimited, $xlTextQualifierNone, $false, $true) 
$wb = $xl.Workbooks | ? { $_.FullName -eq $txt } 

$wb.SaveAs($xls, $xlWorkbookDefault) 
$wb.Close() 

$xl.Quit() 

[Type]::Missing值對於應保持其默認值的參數是必需的。

+0

Ansgar Wiechers,非常感謝。它適合我! – BIB 2014-08-29 12:34:06

0

快速而骯髒。也許你可以優化它:-)

$p = Import-Csv -Path "C:\Report.csv" -Delimiter "`t" 
$Excel01 = New-Object -ComObject Excel.Application 
$Excel01.Visible = $True 
$Workbook01 = $Excel01.Workbooks.Add() 
$Worksheet01 = $Workbook01.Sheets.Item(1) 
$Worksheet01.Activate() 

#Add csv header to excel 
For ($i = 0; $i -lt ($p | Get-Member | Where-Object -FilterScript {$_.MemberType -eq "NoteProperty"}).Count; $i ++) { 
    $Worksheet01.Cells.Item(1,(1+$i)) = "$(($p | Get-Member | Where-Object -FilterScript {$_.MemberType -eq "NoteProperty"})[$i].Name)" 
} 

#Add csv data to ecxel 
$startRow = 2 
For ($i = 0; $i -lt ($p | Measure-Object).Count; $i ++) { 
    For ($i2 = 0; $i2 -lt ($p[$i] | Get-Member | Where-Object -FilterScript {$_.MemberType -eq "NoteProperty"}).Count; $i2 ++) { 
     $PropertyName = ($p[$i2] | Get-Member | Where-Object -FilterScript {$_.MemberType -eq "NoteProperty"})[$i2].Name 
     $Worksheet01.Cells.Item($startRow,(1+$i2)) = "$($p[$i].$PropertyName)" 
    } 
    $startRow ++ 
}