使用PowerShell将大型csv文件导入到Excel中

问题描述:

我正在写一个脚本,它在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

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

快速而肮脏。也许你可以优化它:-)

$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 ++ 
}