我正在使用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();
}
答案 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是你的。