2013-08-27 42 views
1

我想在服务器上创建并保存excel文件,并稍后将其作为文档发送。在添加附件时,我收到了错误。任何人有任何想法,我该如何解决它?将Excel文件作为附件发送时出错

The process cannot access the file because it is being used by another process 

请找我正在使用的是创建Excel文件和返回路径将在以后添加文件的代码,:

Microsoft.Office.Interop.Excel.ApplicationClass excel = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
      string attachmentPath = Convert.ToString(ConfigurationManager.AppSettings["AttachmentPath"] as object); 
      string path = attachmentPath + FileName; 
      excel.Application.Workbooks.Add(true); 

      int ColumnIndex = 0; 
      foreach (DataColumn col in table.Columns) 
      { 
       ColumnIndex++; 
       excel.Cells[1, ColumnIndex] = col.ColumnName; 
      } 
      int rowIndex = 0; 
      foreach (DataRow row in table.Rows) 
      { 
       rowIndex++; 
       ColumnIndex = 0; 
       foreach (DataColumn col in table.Columns) 
       { 
        ColumnIndex++; 
        excel.Cells[rowIndex + 1, ColumnIndex] = row[col.ColumnName].ToString(); 
       } 
      } 
      excel.DisplayAlerts = false; 
      excel.ActiveWorkbook.SaveAs(path, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, Type.Missing, Type.Missing, 
      false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, 
      Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);     

      excel.Quit(); 
      return path + ".xls"; 

下面是我用上面的路径添加为代码附件的电子邮件:

  if (attachmentPaths != null && attachmentPaths.Length > 0) 
      { 
       foreach (string path in attachmentPaths) 
       { 
        if (!string.IsNullOrEmpty(path)) 
         message.Attachments.Add(new System.Net.Mail.Attachment(path)); 
       } 
      } 
      SmtpClient smtp = new SmtpClient(objBO.SmtpDomain); 
      smtp.Send(message); 

请提供建议。提前致谢。

+0

我知道这是一个愚蠢的问题,但你没有在Excel中打开的文件或任何偶然的机会吗? – ars265

+0

不,我正在创建代码中的excel文件,并在下一刻将它作为附件发送。在后面的部分中,我应该删除创建的同一个excel文件。所以没有问题,同时手动打开它。 – ABC

+0

您的网站可能运行在不是所有权限的帐户下 – meda

回答

0

谢谢大家的回复。但我的问题解决了。老实说,我不知道确切的原因,但是我做的只是在创建/保存excel文件到服务器上之后和发送电子邮件附件之前添加到下面的行中。

System.Threading.Thread.Sleep(1000); 
0

这可能是因为您可能会使用MS Excel打开Excel文件,或者您是任何其他程序来阅读Excel。检查您的任务管理器并关闭所有应用程序并重新打开该项目并重试。

按照最新的评论,而你正在做这样的

  1. 创建excel文件
  2. 发送excel文件
  3. 删除Excel文件

我认为你试图删除一个正在发送的文件。所以请确保您只有在发送完成时才开始删除文件。

示例代码

SmtpClient smtp = new SmtpClient(objBO.SmtpDomain); 
     try{ 
     smtp.Send(message); 
     } 
     catch{ 
     } 
     finally{ 
     //deletes the file. 
     } 
+0

谢谢您的回复,但我也在做同样的事情。 我得到的错误不是在删除文件时,而是作为附件添加到电子邮件中。 是否有任何程序使用我可以关闭所有进程访问此文件之前添加它作为附件? – ABC

1

我不知道这是问题,但你永远不Close工作簿。

workbook.Close(); 
application.Quit(); 
+0

这会解决你的问题吗? – kbvishnu

0

.NET 4个的附件实现IDisposable,所以你应该确保你有一个使用语句,这样的物品设置时超出范围。

 if (attachmentPaths != null && attachmentPaths.Length > 0) 
      { 
       foreach (string path in attachmentPaths) 
       { 
        if (!string.IsNullOrEmpty(path)) 
        { 
         using(Attachment data = new Attachment(path)) 
         { 
          message.Attachments.Add(data); 
         } 
        }    
       } 
      } 

SmtpClient smtp = new SmtpClient(objBO.SmtpDomain); 
smtp.Send(message); 
相关问题