0

Devexpress Exporter を使用して 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();
}
4

2 に答える 2

2

まず、これがサーバー上で実行されていないことを心から願っています。

次に、Excelのインスタンスが多すぎることが問題である場合は、「毎回インスタンスを作成しないでください」と考えてください。AddDropDownToExcelが呼び出されるたびにExcelを起動する代わりに、同じインスタンスを再利用できますか?

あなたが抱えている問題は、Excelの相互運用シナリオで定期的に発生します。完了してExcelに閉じるように指示しても、Excelは「存続」します。これは通常、破棄されていないCOMオブジェクトへの参照をアプリが保持しているために、Excelが閉じられないことが原因で発生します。このStackOverflowの回答は、いくつかの指針を提供します:https ://stackoverflow.com/a/158752/114519

一般に、この問題を回避するには、「ワンドット」ルールに従う必要があります。たとえば、コードでは次のようになります。

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

ワークブックの「匿名」ラッパーが作成され、適切に破棄されない可能性があるため、問題が発生します。「1ドット」ルールは、この場合、「Excel相互運用機能を操作するときに複数のドットを使用しないでください」と言います。

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

まったく異なる考え方-Interopを使用する代わりに、OpenXMLを使用してExcelファイルを生成することはできませんか?ドロップダウンを作成しようとしたことはありませんが、サポートされていれば、Interopよりもはるかに高速であり、このような問題は発生しません。

お役に立てれば。

于 2012-11-16T18:02:41.877 に答える
0

私が知っているように、実行中のExcel.exeプロセスの数の増加は、Excelにとって「通常の」状況です:)
最も愚かなアドバイスは、プロセスを時々殺すことです。ただし、アプリの動作中にExcelを使用する場合、この方法はまったく役に立ちません。どちらのexcel.exeが自分のものかがわからないためです。

于 2012-11-16T17:44:26.070 に答える