0

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

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

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

现在,如果我有 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();
}
4

2 回答 2

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);

一个完全不同的想法——你不能使用 OpenXML 来生成 Excel 文件,而不是使用 Interop?我从未尝试过用它来创建下拉菜单,但如果它支持它,它会比 Interop 快得多,而且不会发生你遇到的那种问题。

希望这可以帮助。

于 2012-11-16T18:02:41.877 回答
0

据我所知,runnig excel.exe 进程数量的增长是 excel 的“正常”情况 :)
最愚蠢的建议就是有时杀死它的进程。但是,如果您在应用程序工作期间使用 excel,这种方式绝对没有帮助,因为您宁愿不知道哪个 excel.exe 是您的。

于 2012-11-16T17:44:26.070 回答