2016-04-14 40 views
4

Iterop içeren bir dosyayı açtığımda ve okuduğumda bir Excel arka plan işlemi açık kalır. Aşağıdaki yöntemi birkaç kez çalıştırdıktan sonra, bir çok Excel arka plan işlemiyle sonuçlandım. Bunun çeşitli zamanlardan önce sorulduğunu anladım ama tüm önerileri denedim (ve bunları aşağıdaki kodda uyguladık) ve hiçbir şey işe yaramadı. Birisi yardım edebilir.Excel Arka Plan İşlemi Kapanmıyor

public List<double> ReadExcelFile() 
    { 
     Application excelApp = null; 
     Workbooks workbooks = null; 
     Workbook workBook = null; 
     Worksheet worksheet = null; 
     Range excelRange = null; 
     List<double> sheetValues = new List<double>(); 

     try 
     { 
      excelApp = new Application(); 
      workbooks = excelApp.Workbooks; 
      workBook = workbooks.Open(f_inputFilePath, 
       Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
       Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
       Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
       Type.Missing, Type.Missing); 
      worksheet = workBook.Sheets["Sheet1"]; 
      excelRange = worksheet.UsedRange; 
      object[,] sheetValuesRaw = (object[,])excelRange.get_Value(XlRangeValueDataType.xlRangeValueDefault); 

      for (int i = f_firstNumericValueIndex; i <= sheetValuesRaw.GetLength(0); i++) 
       sheetValues.Add((double)sheetValuesRaw[i, 1]); 
     } 
     finally 
     { 
      workBook.Close(false, Type.Missing, Type.Missing); 
      workbooks.Close(); 

      releaseObject(excelRange); 
      releaseObject(worksheet); 
      releaseObject(workbooks); 
      releaseObject(workBook); 

      excelApp.Quit(); 
      releaseObject(excelApp); 
     } 
     return sheetValues; 
    } 

    private void releaseObject(object obj) 
    { 
     try 
     { 
      Marshal.ReleaseComObject(obj); 
      obj = null; 
     } 
     catch (Exception ex) 
     { 
      obj = null; 
     } 
     finally 
     { 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
     } 
    } 

cevap

2

Birkaç hafta önce kendimi Excel uygulamasında birkaç sorunla karşılaştım. İşlemi çözmeyi başardım, ancak Excel işlevini kullanan yöntemi try-catch-finally deyimiyle sarar.

Yani böyle bir şey görünecektir:

public List<double> MyResults() { 
    try { 
     return ReadExcelFile(); 
    } 
    finally { 
     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
    } 
} 

Ve 'ReadExcelFile' çağrıldığını şu anda o zamandan nereye yerine 'MyResults' yöntemini çağırır.

Excel işlevlerini, Interop hizmetlerini kullanarak başka bir try-catch-finally döngüsünün içine yerleştirerek, Excel bits'in kapsam dışı kalmasına ve GC'nin bunları toplamasına izin verdiğini buldum.

+0

Teşekkürler, işe yaradı! – TheXela