即使在调用Quit之后,Excel进程仍然保持有效

我使用Devexpress Exporter创buildExcel工作表,然后将文件保存在特定位置。

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

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

现在,如果我有1000个电子邮件地址,并自动执行此过程,它正在创build10个以上的Excel实例。

如何停止创build这些实例,以及如何在不使用更多内存的情况下使用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(); } 

首先,我衷心希望这不是在服务器上运行。

那么,如果你的问题是创build了太多的Excel实例,一个想法是“不要每一次创build一个实例”。 每次调用AddDropDownToExcel时都不要启动Excel,而是可以重用相同的实例吗?

您遇到的问题在Excel互操作场景中定期显示; 即使你完成了,并告诉Excelclosures,它仍然“活着”。 这通常是由于您的应用程序仍然保留对尚未处置的COM对象的引用,导致Excel无法closures。 这StackOverflow答案提供了一些指针: https : //stackoverflow.com/a/158752/114519

一般来说,为了避免这个问题,你要遵循“一点”规则。 例如,在你的代码中:

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

将是一个问题,因为工作簿的“匿名”包装被创build,并可能不会被妥善处置。 “单点”规则会说“在使用Excel互操作时不要使用多个点”,在这种情况下:

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

一个完全不同的想法 – 不是使用Interop,你不能使用OpenXML来生成你的Excel文件吗? 我从来没有尝试过创build下拉菜单,但是如果它支持它,它将比Interop快得多,而且您遇到的问题types也不会发生。

希望这可以帮助。

据我所知,runnig excel.exe进程的数量增长是“正常”的情况下,擅长:)
最愚蠢的build议只是杀死有时它的过程。 但是,这种方式将是绝对无益的,如果你在你的应用程序正在工作,因为你使用Excel,而不是得到哪一个excel.exe是你的。