性能问题:使用Powershell将csv转换为excel

我正在使用下面的强大的shell代码将csv转换为excel。 但是performance看起来很糟糕,对于一个200MB的csv文件,我一直在等待20分钟。 任何人都有想法如何提高性能。 或者我必须务实做(使用Java使用Apache poi库)?

function convertToExcel { param($fileName, $outputDir) # the two parameters. #generate OutputFileName $outputFilename = -join($fileName.BaseName, ".xlsx"); #prepare excel sheet $excel = New-Object -ComObject Excel.Application #$excel.visible = $true $workbook = $excel.workbooks.add() $sheets = $workbook.sheets $sheetCount = $Sheets.count $mySheet = 1 $mySheetName = "Sheet" + $mySheet $s1 = $sheets | where{$_.name -eq $mySheetName} $s1.Activate() #Delete all other Sheets If ($sheetCount -gt 1) { $Sheets | ForEach { $tmpSheetName = $_.Name $tmpSheet = $_ If ($tmpSheetName -ne "Sheet1") { $tmpSheet.Delete() } } } #copy paste data from csv #$s1.Name = $fileName.BaseName $s1.Name = "sheet1" $s1.Activate() $s1Data = Import-Csv $file.FullName -Delimiter '^' $s1Data | ConvertTo-Csv -Delimiter "`t" -NoTypeInformation | Clip $s1.cells.item(1,1).Select() $s1.Paste() $workbook.SaveAs("$outputDir\$outputFilename") $excel.Quit() } #Read Input from Arguments if ($args.length -ne 3){ }else{ $fileName = $Args[0] #read fileName $inputFolder = $Args[1] #read inputFolder $outputFolder = $Args[2] #read outputFolder $files = dir -Path $inputFolder $fileName ForEach ($file in $files) { convertToExcel $file $outputFolder } } 

你有没有试过在Excel中打开一个CSV文件? 这可能是最快的方法。

 $app = New-Object -ComObject Excel.Application $app.Visible = $true $app.DisplayAlerts = $False $app.Workbooks.Open("yourcsvfile.csv") 

另一种方式是按行读取文件并添加整行,但速度会变慢。

但是,转换到PS对象并逐个单元格写入将始终最慢。

编辑 :这是一个完整的function…

 function ConvertToExcel { param($fileName) $outputFilename = -join($fileName.split('.')[0], ".xls") $excel = New-Object -ComObject Excel.Application #$excel.Visible = $true $excel.DisplayAlerts = $False $wb = $excel.Workbooks.Open($fileName) $wb.SaveAs("$outputFilename", [Microsoft.Office.Interop.Excel.XlFileFormat]::xlExcel8) Start-Sleep -Milliseconds 200 $excel.Quit() [System.Runtime.Interopservices.Marshal]::ReleaseComObject($excel) Remove-Variable excel } ConvertToExcel "D:\tst\serverlist.csv"