2017-09-04 23 views
0

以下のコードを使用してExcelファイルをpdfファイルに変換しました。
次の方法でExcelオブジェクトを解放しようとしました。
- COMが
オブジェクトを持つ2つのドットを使用しないでください - - からReleaseComObject
- GC.Collectc#pdfファイルの作成後にExcelがクリーンアップされない

しかし、まだタスクマネージャで "EXCEL.EXE" のまま&閉じる&ヌル
が終了します。
タスクマネージャのプロセスリストを呼び出して「EXCEL.EXE」を終了したくない

この問題を解決するにはどうすればよいですか?あなたのfinally文で

public bool ExportWorkbookToPdf(string workbookPath, string outputPath) 
{ 
    // If either required string is null or empty, stop and bail out 
    if (string.IsNullOrEmpty(workbookPath) || string.IsNullOrEmpty(outputPath)) 
    { 
     return false; 
    } 

    // Create COM Objects 
    Microsoft.Office.Interop.Excel.Application excelApplication; 
    Microsoft.Office.Interop.Excel.Workbooks excelWorkbooks; 
    Microsoft.Office.Interop.Excel.Workbook excelWorkbook; 

    // Create new instance of Excel 
    //var excelApplication = new Microsoft.Office.Interop.Excel.Application(); 
    excelApplication = new Microsoft.Office.Interop.Excel.Application(); 

    // Make the process invisible to the user 
    excelApplication.ScreenUpdating = false; 

    // Make the process silent 
    excelApplication.DisplayAlerts = false; 

    // Open the workbook that you wish to export to PDF 
    excelWorkbooks = excelApplication.Workbooks; 
    excelWorkbook = excelWorkbooks.Open(workbookPath); 

    // If the workbook failed to open, stop, clean up, and bail out 
    if (excelWorkbook == null) 
    { 
     //excelApplication.Application.Quit(); 
     excelApplication.Quit(); 

     excelWorkbook = null; 
     excelWorkbooks = null; 
     excelApplication = null; 

     return false; 
    } 

    var exportSuccessful = true; 
    try 
    { 
     excelWorkbook.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF, outputPath); 
    } 
    catch (System.Exception ex) 
    { 
     // Mark the export as failed for the return value... 
     exportSuccessful = false; 

     // Do something with any exceptions here, if you wish... 
     // MessageBox.Show...   
    } 
    finally 
    { 
     // Close the workbook, quit the Excel, and clean up regardless of the results... 
     excelWorkbook.Close(); 
     excelWorkbooks.Close(); 
     excelApplication.Quit(); 

     excelWorkbook = null; 
     excelWorkbooks = null; 
     excelApplication = null; 

     ReleaseExcelObject(excelWorkbook); 
     ReleaseExcelObject(excelWorkbooks); 
     ReleaseExcelObject(excelApplication); 
    } 
    return exportSuccessful; 
} 
private static void ReleaseExcelObject(object obj) 
{ 
    try 
    { 
     if (obj != null) 
     { 
      Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
    } 
    catch (Exception ex) 
    { 
     obj = null; 
     throw ex; 
    } 
    finally 
    { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 
} 

答えて

0

あなたはReleaseExcelObjectに渡すために同じ参照を使用する前に、nullにexcelWorkbook、excelWorkbooks & excelApplicationを設定する - あなたは効果的ReleaseExcelObject(null)を呼び出しています。 GCCollectを呼び出すだけです。注文を交換してみてください。

また、以前のコードでは、ブックを開くことができなかった場合は、アプリケーションを終了するだけで、&が参照をnullに設定しました。 tryステートメント内でワークブックのオープンを試みることができるので、重複したコードを要求するのではなく、finallyステートメントでエラー状態がクリーンアップされます。線に沿って

何か:

var exportSuccessful = true; 
try 
{ 
    excelWorkbook = excelWorkbooks.Open(workbookPath); 

    // If the workbook failed to open, stop, clean up, and bail out 
    if (excelWorkbook == null) 
    return false; 

    excelWorkbook.ExportAsFixedFormat(Microsoft.Office.Interop.Excel.XlFixedFormatType.xlTypePDF, outputPath); 
} 
catch (System.Exception ex) 
{ 
    // Mark the export as failed for the return value... 
    exportSuccessful = false; 

    // Do something with any exceptions here, if you wish... 
    // MessageBox.Show...   
} 
finally 
{ 
    // Close the workbook, quit the Excel, and clean up regardless of the results... 
    excelWorkbook?.Close(); 
    excelWorkbooks?.Close(); 
    excelApplication?.Quit(); 

    ReleaseExcelObject(excelWorkbook); 
    ReleaseExcelObject(excelWorkbooks); 
    ReleaseExcelObject(excelApplication); 

    excelWorkbook = null; 
    excelWorkbooks = null; 
    excelApplication = null; 
} 
関連する問題