2016-03-15 5 views
1

Я использую ниже код оболочки питания для преобразования csv в excel. Но производительность кажется плохим, для файла csv размером 200 мб я ждал 20 минут. У каждого есть идея, как улучшить производительность. Или мне нужно делать прагматично (используя java, используя библиотеку apache poi)?Проблема с производительностью: конвертировать csv в excel с помощью Powershell

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

вам нужно конвертировать такие файлы CSV часто ли? Не стоит ли инвестировать время, чтобы переписать сценарий на Java, или вы можете просто уйти и обедать, пока он работает? –

+0

Да, мне нужно, чтобы он работал часто. это для еженедельного отчета. отчет может составлять до нескольких сотен МБ. –

+1

Вы рассматривали возможность открытия файла CSV в excel напрямую? –

ответ

0

Вы пытались открыть файл CSV в Excel? Это, вероятно, самый быстрый метод.

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

Другой путь будет читать файл по строкам и добавлять целые строки, но это будет медленнее.

Однако преобразование в объект PS и запись ячейки по ячейке всегда будут самыми медленными.

Редактировать: Вот полная функция ...

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" 
+0

Да, я знаю, что excel может открывать csv напрямую. Дело в том, что мне нужно преобразовать его в excel автоматически. без я щелкаю открытое excel и сохраняю как. –

+0

Не следуйте, код выше откроет csv, и у вас уже есть код, чтобы сохранить его как xls. Никаких кнопок. –

+0

Я добавил полную функцию к ответу. –

Смежные вопросы