2014-08-29 1 views
0

큰 csv 파일을 Excel 문서로 가져 오는 스크립트를 작성하고 있습니다. 데이터를 입력하고 배열을 루핑하지 않고 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... 

하지만 이걸 실행하면 매달아 ... 어떻게 할 수 있습니까?

+1

Excel에서 직접 CSV 파일을 여는 것이 잘못된 이유는 무엇입니까? –

+0

또는 텍스트에서 가져 오기 마법사를 사용하십시오. –

+0

데이비드 브라 반트, 데이터 쿼리 SQL 서버가 필요하고 xlsx 파일로 저장하고 전자 메일로 보내고 (이 작업을 여러 번 반복하십시오.) 그래서 이러한 작업을 자동화하려고합니다. 그래서 bss 명령 줄 도구를 사용하여 mssql에서 csv 파일로 데이터를 내보내고 어떻게 든 Excel 형식으로 변환해야합니다. – BIB

답변

1

OpenText() :-)를 최적화 할 수 있습니다. 그러나 텍스트 파일의 확장명을 .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

0

빠르고 지저분합니다. 어쩌면 당신은 이미 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() 

#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 ++ 
} 
관련 문제