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 回答