2012-11-16 43 views
0

我使用Devexpress Exporter创建Excel工作表,然后将文件保存在特定位置。即使在调用退出后,Excel进程仍然保持活着

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

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

现在,如果我有1000个电子邮件地址,并自动完成这一过程,它正在创建的Excel 10多个实例。

我怎样才能阻止这些实例的创建,我怎么可以使用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(); 
} 
+0

我在VBA中使用下面的代码来附加到Excel的现有实例或创建一个新的。也许你头在正确的方向: 公用Sub InitializeExcel(aNewInstance正如布尔) 如果aNewInstance = false,那么 上的错误继续下一步 设置xlApp = GetObject的(“Excel.Application”) 结束如果 对错误转到0 如果xlApp不是那么 设置xlApp = CreateObject(“Excel。应用程序“) End If End Sub – 2012-11-16 18:08:41

回答

0

据我所知运行过程中出现EXCEL.EXE进程数的成长是“正常”的情况下脱颖而出:)
最愚蠢的意见只是有时杀死它的进程。但是,这种方式将是绝对无益的,如果你在你的应用程序正在工作时使用excel而不是你的excel.exe。

+0

感谢您的回复。所以,你的意思是说,如果有100个用户使用这个系统,我应该有空余的时间来杀死每个人的进程,这样我的服务器不会给内存异常:) –

+0

不要在服务器上运行此代码;一般情况下,请勿使用Office Interop服务器端。请参阅Microsoft对此的评论:http://support.microsoft.com/kb/257757 – Mathias

+0

@RuchiDoshi,对不起:)但你没有提到'服务器'这个词 - 它以上面Mathias写的方式进行了修改。Btw,th Mathias for link。 – pkuderov

2

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

然后,如果你的问题是当创建的Excel太多的情况下,想到的是“不创建一个实例,每一次”。每次调用AddDropDownToExcel时,您都可以重用相同的实例,而不必每次启动Excel?

您遇到的问题在Excel interop场景中定期显示;即使你完成了并告诉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); 

完全不同的想法 - 而不是使用互操作的,你能不能使用OpenXML来生成你的Excel文件?我从来没有尝试过创建下拉菜单,但是如果它支持它,它将比Interop快得多,并且您拥有的问题类型不会发生。

希望这会有所帮助。

+0

我明白你的解释,但我的问题仍然存在,如何使用线程自动执行进程而不创建Excel的实例??? –

+0

这与线程有什么关系?无论您是否使用线程,您的代码都将仍然会打开一个或多个将挂起的Excel实例。你能解释为什么你认为线程会有帮助吗? – Mathias

+0

我可以收集生成文件所需的所有信息,然后启动一个调用excel应用程序的一个实例的线程>>>>>,这将生成多个文件。如我错了请纠正我。 –

相关问题