2016-06-20 10 views
3

私はこのスクリプトを私はちょうどうまく動作する私のラップトップでコード化している仕事は、1つの.xlsファイルに2つの.csvファイルを結合することです。 数千の行を含む2つの.csvファイルを使用してスクリプトを実行すると、数秒かかることがあります。Excelスロー実行Excelを使用してPowershellスクリプト

しかし、サーバーを配置するサーバーで実行しようとすると、時間はかかります。私は完全な実行をしていませんが、.xlsファイルに1行を書き込むには2〜3秒かかります。

私は不思議なことは、ランタイムの大幅な増加を引き起こしているものです。スクリプト実行中にCPU負荷を監視していますが、負荷は50〜60%です。

サーバーにはRamと2つのCPUコアが搭載されています。 これをどのようにスピードアップできますか?

スクリプトは次のようになります。

$path = "C:\test\*" 
$path2 = "C:\test" 
$date = Get-Date -Format d 
$csvs = Get-ChildItem $path -Include *.csv | Sort-Object LastAccessTime -Descending | Select-Object -First 2 
$y = $csvs.Count 

Write-Host "Detected the following CSV files: ($y)" 
foreach ($csv in $csvs) { 
    Write-Host " "$csv.Name 
} 

$outputfilename = "regSCI " + $date 
Write-Host Creating: $outputfilename 

$excelapp = New-Object -ComObject Excel.Application 
$excelapp.sheetsInNewWorkbook = $csvs.Count 
$xlsx = $excelapp.Workbooks.Add() 
$sheet = 1 
$xlleft = -4131 

foreach ($csv in $csvs) { 
    $row = 1 
    $column = 1 
    $worksheet = $xlsx.Worksheets.Item($sheet) 
    $worksheet.Name = $csv.Name 
    $worksheet.Rows.HorizontalAlignment = $xlleft 
    $file = (Get-Content $csv) 
    Write-Host Worksheet created: $worksheet.Name 

    foreach($line in $file) { 
     Write-Host Writing Line 
     $linecontents = $line -split ',(?!\s*\w+")' 

     foreach($cell in $linecontents) { 
      Write-Host Writing Cell 
      $cell1 = $cell.Trim('"') 
      $worksheet.Cells.Item($row, $column) = $cell1 
      $column++ 
     } 
     $column = 1 
     $row++ 
     $WorkSheet.UsedRange.Columns.Autofit() | Out-Null 
    } 
    $sheet++ 
    $headerRange = $worksheet.Range("a1", "q1") 
    $headerRange.AutoFilter() | Out-Null 
} 

$output = $path2 + "\" + $outputfilename 
Write-Host $output 
$xlsx.SaveAs($output) 
$excelapp.Quit() 

答えて

2

だけでExcelオブジェクトを作成した後にこれらを追加し、既存のコードをスピードアップするために:

$excelapp.ScreenUpdating = $false 
$excelapp.DisplayStatusBar = $false 
$excelapp.EnableEvents = $false 
$excelapp.Visible = $false 

そして、これらを単に名前を付けて保存する前に:

$excelapp.ScreenUpdating = $true 
$excelapp.DisplayStatusBar = $true 
$excelapp.EnableEvents = $true 

これは、コンシューマを変更するたびにワークシートをリアルタイムで表示したり、イベントを発生させたりしないtets。おそらくDisplayStatusBarScreenUpdatingは、あなたがアプリケーションを見えないようにしても関係ありませんが、場合によってはそれを含めています。

また、すべての行の後にAutofit()を実行しています。これは確かにパフォーマンスには役立ちません。

+0

返信いただきありがとうございます。間違いなくこれを試してみます。 'Autofit()' -partについては、エクセルコードを盗まれたばかりなので、明確にしてください。 –

+0

@AndersEkelund AutoFit()は、セルの内容に対するカラムの幅を調整します。必要な場合は、シートごとに1回、すべての行を挿入してからではありません。 –

関連する問題