1

我正在尝试在服务器上创建并保存一个 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);

请提供建议。提前致谢。

4

5 回答 5

1

我不知道这是问题所在,但你从来没有Close你的工作簿。

workbook.Close();
application.Quit();
于 2013-08-27T13:28:57.620 回答
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.
        }
于 2013-08-27T13:25:33.613 回答
0

在 .net 4 附件中实现了 IDisposable,因此您应该确保您有一个 using 语句,以便在超出范围时释放对象。

     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);
于 2013-08-27T15:28:45.823 回答
0

发布 excel com 问题存在已知问题

请参阅http://www.codeproject.com/Articles/9328/Release-Excel-Object

于 2013-08-27T13:38:58.330 回答
0

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

System.Threading.Thread.Sleep(1000);
于 2013-08-28T10:21:12.513 回答