C# 类型为';System.OutOfMemoryException';在DocumentFormat.OpenXml.dll中发生

C# 类型为';System.OutOfMemoryException';在DocumentFormat.OpenXml.dll中发生,c#,asp.net,excel,openxml,C#,Asp.net,Excel,Openxml,我必须在excel中存储大约315k行数据,每行15列,并可供下载。我检索所有数据,然后将其存储在数据表中,然后使用OpenXml将其写入工作簿并发送响应。但是由于数据量巨大,我得到了一个异常 当我尝试检索大约10万条记录时,整个过程运行良好,没有任何错误 我在这里看到过类似的问题,但它是一个FileStream,因此MemoryStream的大小被动态设置为 MemoryStream memory = new MemoryStream(fileStream.size()) 我想知道是否有一

我必须在excel中存储大约315k行数据,每行15列,并可供下载。我检索所有数据,然后将其存储在数据表中,然后使用OpenXml将其写入工作簿并发送响应。但是由于数据量巨大,我得到了一个异常

当我尝试检索大约10万条记录时,整个过程运行良好,没有任何错误

我在这里看到过类似的问题,但它是一个
FileStream
,因此
MemoryStream
的大小被动态设置为

 MemoryStream memory = new MemoryStream(fileStream.size())
我想知道是否有一种方法也可以通过
DataTable
实现这一点。我相信逐行更新excel工作表是一种选择,但这将包括许多用于检查数据类型等的代码

此外,我还面临着很多问题,与“文件被破坏”的工作。因此,我更喜欢xlsx文件

protected void DownloadDetailTable_OnClick(object sender, EventArgs e)
        {
            string value = ddl_AuditEnvironment.SelectedValue;
            String connectionString = ConfigurationManager.ConnectionStrings["stagingConnection"].ConnectionString;    
            // DataTable that stores the result set to be written on an excel. 
            DataTable dataTableObj = GetAuditData.GetDetailsTable(value, connectionString);

            string attachment = "attachment; filename=Summary.xlsx";
            DataTable dataTable = new DataTable();
            XLWorkbook workbook = new XLWorkbook();
            workbook.Worksheets.Add(dataTableObj, "Migrated Records");
            using (MemoryStream memory = new MemoryStream())
            {
                Response.Clear();
                Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                Response.AddHeader("content-disposition", attachment);
                workbook.SaveAs(memory);
                memory.WriteTo(Response.OutputStream);
                memory.Close();
                Response.End();
            }
        }

在处理大型XL文件(大约50到75MB压缩)时,我还必须处理OutOfMemoryException。唯一的方法是将代码从domxml操作切换到类似SAX的XML流。就这一点而言,使用这种方法再次重申了对大型数据集使用类似Sax的方法的需要。但是我还没有看到这个工作簿可以下载的例子。这可以通过将此工作簿保存为内存流并刷新来实现。或者这就是内存不足问题发生的地方?你找到解决方案了吗?@JitendraPancholi解决方案是使用SAX,而不是我之前评论中提到的DOM。我在处理大型XL文件(大约50到75 MB压缩)时也必须处理OutOfMemoryException。唯一的方法是将代码从domxml操作切换到类似SAX的XML流。就这一点而言,使用这种方法再次重申了对大型数据集使用类似Sax的方法的需要。但是我还没有看到这个工作簿可以下载的例子。这可以通过将此工作簿保存为内存流并刷新来实现。或者这就是内存不足问题发生的地方?你得到解决方案了吗?@JitendraPancholi解决方案是使用SAX,而不是我前面评论的答案中提到的DOM。