2013-06-04 1 views
0

Привет У меня есть две части в моем коде, чтобы создать excel, а затем отправить его по электронной почте. я получаю сообщение об ошибке, как: IOException: Процесс не может получить доступ к файлу «имя файла», так как он используется другим процессомКак очистить компоненты excel interop com

Как я могу получить от этого: вот код:

public void createexcel() 
    { 

     Excel.Application oXL; 
     Excel._Workbook oWB; 
     Excel._Worksheet oSheet; 
     oXL = new Excel.Application(); 


     oWB = (Excel._Workbook)(oXL.Workbooks.Add(Missing.Value)); 
     // oSheet = (Excel._Worksheet)oWB.ActiveSheet; 
     //oSheet = (Excel._Worksheet)oWB.Worksheets.get_Item(2); 
     //oSheet = (Excel._Worksheet)oWB.Worksheets.get_Item(2); 
     oSheet = (Excel._Worksheet)oWB.Worksheets.get_Item(1); 

     // oWB.Colors(1); 

     oSheet.Cells[1, 1] = "Expected_Result"; 
     oSheet.Cells[1, 2] = "Actual_Result"; 
     oSheet.Cells[1, 3] = "Test_Status"; 


     //Format A1:D1 as bold, vertical alignment = center. 
     oSheet.get_Range("A1", "D1").Font.Bold = true; 
     oSheet.get_Range("A1", "D1").Font.Color = 0; 
     oSheet.get_Range("A1", "D1").VerticalAlignment = 
     Excel.XlVAlign.xlVAlignCenter; 
     oSheet.Name = "Hotel_Total_Oppy_Verification"; 
     loc = "c:\\" + "TestResults_" + DateTime.Now.ToString("ddMMMMyyHHMMss"); 
     oWB.SaveAs(loc + ".xlsx"); 

     oWB.Close(); 

    } 





    public void emailtestresults (string testresult) 
    { 

     string to = "[email protected]"; 
     string from = "[email protected]"; 
     MailMessage message = new MailMessage(from, to); 
     message.Subject = " Test Result for Run of ." + DateTime.Today.ToString("DD/MM/YY/HHMMss") + "is " + emailresult; 
     message.Body = @"Verify the results from the attached excel sheet or look at the Screenshot."; 
     string PathToAttachment = loc + ".xlsx"; 
     message.Attachments.Add(new Attachment(PathToAttachment)); 
     SmtpClient client = new SmtpClient("xxxxxx"); 
     // Credentials are necessary if the server requires the client 
     // to authenticate before it will send e-mail on the client's behalf. 
     client.UseDefaultCredentials = true; 

     try 
     { 
      client.Send(message); 
      DateTime now = DateTime.Now; 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine("Exception caught in CreateTestMessage2(): {0}", ex.ToString()); 
      Console.ReadLine(); 
     } 
    } 
+0

Попробуйте посмотреть на 'Marshal.ReleaseComObject (OWB); 'то же будет работать для' oXL' 'oSheet = null' – MethodMan

+0

Попробуйте' oXL.Quit() 'после' oWB.Close() ' –

ответ

0

Я всегда заканчиваю Excel-Interop-компонент таким образом:

owB.Close(); 
owX.Quit(); 
Marshal.FinalReleaseComObject(oSheet); 
Marshal.FinalReleaseComObject(owB); 
Marshal.FinalReleaseComObject(owX); 

но проблема вашего IOException является то, что у вас нет доступа к директории C: \ без разрешения администратора.

Попробуйте сохранить его в пути пользователей вместо (или start the program with admin permission):

string loc = @"C:\Users\MYUSER\Desktop"; 

или с помощью:

string loc = Environment.GetFolderPath(Environment.SpecialFolder.Personal); 

enter image description here

+0

Хорошо, это оказалось маленькой вещью. Я действительно использовал вызов метода oledb и никогда не закрывал это соединение после добавления шага закрытия соединения. это сработало. Спасибо всем за вклад. Я могу избежать мусора в памяти, который в любом случае был бы создан. –

 Смежные вопросы

  • Нет связанных вопросов^_^