2

MVCでデータテーブルをExcelファイルにストリーミングしようとしています。行数が250,000を超えると、OutOfMemory例外が発生します。以下はコードです:

   var memStream = new MemoryStream();
   var streamWriter = new StreamWriter(memStream);

   streamWriter.WriteLine("{0}", "<TABLE>");
   foreach (DataRow rw in dt.Rows)
   {
       streamWriter.WriteLine("{0}", "<TR>");
       foreach (DataColumn cl in dt.Columns)
       {
             streamWriter.WriteLine("{0}", "<TD>");
             streamWriter.WriteLine("{0}", rw[cl].ToString());
             streamWriter.WriteLine("{0}", "</TD>");
       }
       streamWriter.WriteLine("{0}", "</TR>");

    }
    streamWriter.WriteLine("{0}", "</TABLE>");

    streamWriter.Flush();
    memStream.Seek(0, SeekOrigin.Begin);

    return File(memStream, "application/vnd.ms-excel", "Test.xls");

バッファを介してメモリ ストリームに書き込むことで、OutOfMemory の問題が解決すると思います。しかし、私はそうすることができませんでした。メモリストリームへのバッファリングされた書き込みのために上記のコードをどのように変更すればよいですか?

ありがとう

4

1 に答える 1

1

StreamWriter がクライアントに送信される前にフラッシュされるかどうかに関係なく、最初にテーブル全体がメモリに書き込まれるため、メモリが不足します。

ソリューション:

  1. メモリの代わりに context.HttpContext.Response.OutputStream に直接書き込みます。短所: 面倒で、Content-Type や Content-Disposition などのヘッダーに注意する必要があります。

  2. 私の好みの解決策。この質問に対するトップの回答を参照してください:アクションからの出力ストリームへの書き込み

于 2013-10-28T10:36:25.663 に答える