2011-07-19 17 views
1

Powershellを使用して、タブ区切りのAsciiファイルをMS Excelにインポートします。私はそうするためにループを使用して、今の私が働く簡単な解決策があります:私は今powershell:excelが既に実行されている場合はインスタンスを取得し、そうでない場合は例外ハンドリングを開始します。

for each file: start Excel , import tsv file, close Excel. 

エクセル2010、Excelはパスで、それはエクセルの正しいバージョンださ..assuming

をより効率的なバージョンに移行したいと考えています。

ファイルごとに:実行中のインスタンスがある場合はそれを実行し、存在しない場合はExcelを起動しようとします。プロセスファイル。キープしてください。最後に、開いたままにしておきます(スクリプトが実行されている間にExcelファイルを見たいと思っていますが、それはしばらく時間がかかる可能性があります。

私はインターネット上の他の場所でも、これに関する包括的な解決策を見つけられませんでした。 「包括的な」とは、「例外処理」を意味します。 Powershellでは、ちょっと混乱します。例外を扱うには、トラップとtry-catchブロックの2つの方法があります。

いくつかのインターネットソースから一緒にスローされたコードですが、どうすれば改善できますか?

私はそれを関数にラップしたいが、戻り値としてCOMオブジェクトは問題がある。 ( は、私が欲しいのは「シンプル工場」と「シングルトン」の組み合わせである。)

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.Office.Interop.Excel") 
    try { 

     $excelApp = [System.Runtime.InteropServices.Marshal]::GetActiveObject("Excel.Application") 


    } catch [System.Runtime.InteropServices.COMException], [System.Management.Automation.RuntimeException]{ 

     write-host    
     write-host $("TRAPPED: " + $_.Exception.GetType().FullName); 
      write-host $("TRAPPED: " + $_.Exception.Message); 
      write-host "Excel is not running, trying to start it"; 

      $excelApp = New-Object -ComObject "Excel.Application" 
      if (-not $excelApp){ 
       # excel not installed, not in path 
       Write-Error "Excel not running, and cannot be started, exiting." 
       # Todo: test if excel version is correct, e.g. english Excel 2007 or 2010., if not set outfile extension xls. 
       exit; 
      }    
    } 

    catch [System.Exception]{ 
     write-host $("EXCEPTION: " + $_.Exception.GetType().FullName); 
     write-host $("EXCEPTION: " + $_.Exception.Message);c 
     Write-Error 'Something went wrong during creation of "Excel.Application" object, => Exit.' 
     exit; 
    } 

答えて

0

あなたはこれを尋ねたので、それはしばらくしているが、私は同じ問題に遭遇してきました。あなたのコードは、妥当な解決策のほんの一例にすぎません。私はあなたの懸念に疑問を呈します。具体的には、Excelが実行されると関数内でこのルーチンを再度呼び出す必要がありますか?つまり、Excelを開いたら、ワークブックを開いたり閉じたりして、その中のワークシートにアクセスし、最終的には$ excelApp.Quit()アプリケーションとして扱うことができます(Powershell v1.0では.Quitアプリケーションを終了しないで...しかし、私は実行中のインスタンスをとにかくつかんでいるので、それはOKです)。

以下のリンクは、必要に応じて明示的に強制終了するために、ExcelインスタンスのPIDを起動して取得する方法について説明します。

Discussion on Quiting/Killing Excel from within Powershell

+0

は、私が覚えている限りでは、私は、Excelの実行中のインスタンスを探してみました、そして1が存在しない場合、それはcatchブロック内に新しいものを開始しようとします。たぶん、それはより良い/より堅牢な方法で行うことができますが、私はその時点でpowershellを学んでいました(そして、私はまだ、intermissionsで) – knb

0

すべての変数はNULLでなければなりません。 Excel.Workbooks - すべての公開本。 ブックの数をチェックします。 count = 0の場合、終了します。 Powershellの終了後にもExcelは近いでしょう。

$Workbook.Close() $WorkSheet = $null; $Workbook = $null; If($excelApp.Workbooks.Count -eq 0) {$excelApp.Quit()} $excelApp = $null;

関連する問題