即使在调用Quit之后,Excel进程仍保持活动状态

时间:2012-11-16 17:26:24

标签: excel devexpress export-to-excel excel-interop

我正在使用Devexpress Exporter创建Excel Sheet,然后将文件保存在特定位置。

创建文件后,我必须打开它,添加项目的下拉列表,然后再将其保存在同一位置。

完成所有操作后,必须将文件自动通过电子邮件发送到数据库中的电子邮件地址。

现在,如果我有1000个电子邮件地址,并且为了自动完成此过程,它将创建10个以上的Excel实例。

如何停止创建这些实例,以及如何在不使用更多内存的情况下使用excel操作。

代码如下:

protected string CreateExcelFile(string FilterName)
{       
    Random ranNumber = new Random();
    int number = ranNumber.Next(0, 10000000);
    string FileName = "TestDoc"+DateTime.Now.Year.ToString()+number.ToString()+DateTime.Now.Second.ToString()+".xls";
    string path = @"c:\TestDocuments\"+FileName;            
    Directory.CreateDirectory(Path.GetDirectoryName(path));
    FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
    XlsExportOptions options = new XlsExportOptions();
    options.ExportHyperlinks = false;
    ASPxExporter.WriteXls(fs, options);
    fs.Close();     
    AddDropDownToExcel(path);   
    return path;    
}
//Adding The Dropdownlist Of Items TO Generated Excel Sheet
protected void AddDropDownToExcel(string path)
{
         Microsoft.Office.Interop.Excel.Application application = new Microsoft.Office.Interop.Excel.Application();     
    string fileName = path.Replace("\\", "\\\\");
    string RowCount = "F" + (testgrid.VisibleRowCount + 1).ToString();
    // Open Excel and get first worksheet.      
    var workbook = application.Workbooks.Open(fileName);
    var worksheet = workbook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet;
    // Set range for dropdownlist
    var rangeNewStatus = worksheet.get_Range("F2", RowCount);
    rangeNewStatus.ColumnWidth = 20;
    rangeNewStatus.Validation.Add(Microsoft.Office.Interop.Excel.XlDVType.xlValidateList, Microsoft.Office.Interop.Excel.XlDVAlertStyle.xlValidAlertStop,
    Microsoft.Office.Interop.Excel.XlFormatConditionOperator.xlBetween, "Item1,Item2,Item3,Item4");
    // Save.
    workbook.Save();
    workbook.Close(Microsoft.Office.Interop.Excel.XlSaveAction.xlSaveChanges, Type.Missing, Type.Missing);
    application.Quit();
}

2 个答案:

答案 0 :(得分:2)

首先,我真诚地希望这不是在服务器上运行。

然后,如果你的问题是创建了太多的Excel实例,那就是“不要每次都创建一个实例”。每次调用AddDropDownToExcel时,您是否可以重用相同的实例,而不是启动Excel?

您遇到的问题会在Excel互操作方案中定期显示;即使你已经完成并告诉Excel关闭,它仍然“活着”。这通常是由您的应用程序仍然持有对尚未处理的COM对象的引用,导致Excel无法关闭。这个StackOverflow答案提供了一些指示:https://stackoverflow.com/a/158752/114519

通常,要避免此问题,您需要遵循“一点”规则。例如,在您的代码中:

var workbook = application.Workbooks.Open(fileName);  

将是一个问题,因为工作簿的“匿名”包装器已创建,并且可能无法正确处理。 “一点”规则会说“使用Excel互操作时不要使用多个点”,在这种情况下:

var workbooks = application.Workbooks;
var workbook = workbooks.Open(fileName);

一个完全不同的想法 - 不是使用Interop,你不能使用OpenXML生成Excel文件吗?我从来没有试过它来创建下拉,但如果它支持它,它将比Interop快得多,并且你不会遇到类型的问题。

希望这有帮助。

答案 1 :(得分:0)

据我所知,runnig excel.exe进程数量的增长是正常的'情况优秀:)
最愚蠢的建议就是杀死它的进程。但是,如果你在应用程序运行期间使用excel,这种方式绝对没有用,因为你不知道哪个excel.exe是你的。