Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将大型数据表输出到excel文件_C#_Excel_Asp.net Mvc 4_Stream - Fatal编程技术网

C# 将大型数据表输出到excel文件

C# 将大型数据表输出到excel文件,c#,excel,asp.net-mvc-4,stream,C#,Excel,Asp.net Mvc 4,Stream,我正在尝试在MVC中将数据表流式输出到excel文件。当行数超过250000时,它为我提供了OutOfMemory例外。代码如下: var memStream = new MemoryStream(); var streamWriter = new StreamWriter(memStream); streamWriter.WriteLine("{0}", "<TABLE>"); foreach (DataRow rw in dt.Rows) {

我正在尝试在MVC中将数据表流式输出到excel文件。当行数超过250000时,它为我提供了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");
var memStream=newmemoryStream();
var streamWriter=新的streamWriter(memStream);
streamWriter.WriteLine(“{0}”,”);
foreach(数据行rw在dt.行中)
{
streamWriter.WriteLine(“{0}”,”);
foreach(数据列cl在dt.列中)
{
streamWriter.WriteLine(“{0}”,”);
streamWriter.WriteLine(“{0}”,rw[cl].ToString());
streamWriter.WriteLine(“{0}”,”);
}
streamWriter.WriteLine(“{0}”,”);
}
streamWriter.WriteLine(“{0}”,”);
streamWriter.Flush();
memStream.Seek(0,SeekOrigin.Begin);
返回文件(memStream、“application/vnd.ms excel”、“Test.xls”);
我认为通过缓冲区写入内存流应该可以解决OutOfMemory问题。然而,我未能做到这一点。我应该如何修改上面的代码,以便对内存流进行缓冲写入


谢谢

内存不足,因为无论StreamWriter在发送到客户端之前是否刷新,整个表都会首先写入内存

解决方案:

  • 直接写入context.HttpContext.Response.OutputStream而不是内存。反对的论点: 杂乱无章,您必须注意像内容类型和内容处置这样的标题

  • 我喜欢的解决方案。请参见此问题的顶部答案:


  • 如果在循环中调用
    streamWriter.Flush()
    ,会有帮助吗?通常,flush会将缓冲区中的所有内容都写入,所以我认为这会有所帮助。不过,仔细想想,如果您试图在MemoryStream中放入超出可用内存的内容,这可能没有帮助。@SouthShoreAK:trued
    streamwriter.Flush()
    。这没用。@SouthShoreAK:谢谢!它帮助我明白了写
    FileStream
    将解决OutOfMemory问题。谢谢。我发现整张表太大,内存不够。所以改用了
    FileStream