2012-04-18 15 views
4

Excelファイルを作成してC#から保存して閉じると、タスクマネージャからExcelを解放できません。Excelを作成してC#4.0でExcelファイルを閉じた後もExcelがまだ実行中です

私はExcelのインスタンスを作成するには、次のコードを使用し

Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application(); 

Microsoft.Office.Interop.Excel.Workbook workbook = xlApp.Workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet); 
Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]; 

私はその後、私のワークシートを移入:次に

workbook.SaveAs(filePath); 

:私は、ブックを保存その後

worksheet.Cells[1, 1] = "Test"; 
worksheet.Cells[1, 2] = "Test"; 
worksheet.Cells[1, 3] = "Test"; 
worksheet.Cells[1, 4] = "Test"; 

を閉じる:

workbook.Close(false, false); 

、その後は、Excel終了:

xlApp.Quit(); 

をしかし、私はこのExcelを行った後、まだタスクマネージャに表示されます!!?!?

私はxlApp.Quit()を呼び出した後、これがなぜ閉じられないのでしょうか?

ありがとうございます。

+0

が重複する可能性:http://stackoverflow.com/questions/1884217/why-does-excel-remain-open EPPlusを言及するため – voidengine

答えて

6

おそらく、InteropをドロップしてEPPlusを使用してExcelファイルを作成/修正することができます。それは非常に簡単で、コンピュータ上でOfficeを持つことについてはリレーしません。

しかし、あなたが本当に相互運用機能と一緒に行きたい場合は、これは(私は数分で800+ Excelファイルを作成する必要がありましたようにすべてが適切に配置されていることを確認するために私のコードでそれを使用してきた)役立つかもしれない:

 workBook.Close(true, filePathTarget, Missing.Value); 
     app.DisplayAlerts = true; 
     app.Quit(); 
     Release(workSheet2); 
     Release(workSheet1); 
     Release(workBook); 
     Release(workBooks); 
     Release(app); 
     workSheet2 = null; 
     workSheet1 = null; 
     workBook = null; 
     workBooks = null; 
     app = null; 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 

どこ:

private static void Release(object obj) { 
     // Errors are ignored per Microsoft's suggestion for this type of function: 
     // http://support.microsoft.com/default.aspx/kb/317109 
     try { 
      System.Runtime.InteropServices.Marshal.FinalReleaseComObject(obj); 
     } catch { 
     } 
    } 

しかし、私は本当にあなたが唯一のXLSXファイルを扱う場合EPPlusを使用しようとするあなたを促します。それは素晴らしい、それは速く、効率的であり、インストールされているMicrosoft Officeでリレーしません。それを1時間処理した後、私はInteropを5分後に落としました...

+0

感謝。それは素晴らしいように見えます。インストールされているMS Officeで中継しないことが大きな利点です。 – AlefSin

+0

あなたは大歓迎です。 – MadBoy

0

COM参照を解放するには、xlApp変数をnullに設定する必要があります。参照カウントがゼロでないため、インスタンスを開いたままにしているのはおそらくCOMです。

xlApp = null; 
+0

これでは不十分かもしれません。私はInteropで遊ぶことを覚えていて、それは狂っていました。私はGCに入ってすべてを集めるように強制しなければならなかった。 – MadBoy

+0

私はInteropのファンもいませんが、それが問題でした。 – mgnoonan

+0

私は理解しますが、それはうまくいかないでしょう:-)あなたはエクセルを追い出すためにもう少し遊ぶ必要があります:-)私の答えをチェックし、私が実際にそれを追い出すために何をしていたかを見てください... – MadBoy

関連する問題