导出到c#中的excel导致System.OutOfMemoryException

时间:2017-09-22 07:21:56

标签: c# asp.net .net excel

我有一个200,000行的DataTable。

我想在excel文件中导出DataTable。但它会导致System.OutOfMemoryException错误。

using (ExcelPackage objExcelPackage = new ExcelPackage()) 
{ 
    ExcelWorksheet objWorksheet = 
        objExcelPackage.Workbook.Worksheets.Add("Conversion Data");  
    objWorksheet.Cells["A1"].LoadFromDataTable(FinalResult, true); 
}

1 个答案:

答案 0 :(得分:0)

This answer提供了一种方法,可以将数据表拆分为更小的块(它是通用的但可以使用数据表),并且由于您需要修复的问题是数据表的大小,所以这样的事情应该有效:

public static IEnumerable<IEnumerable<T>> ToChunks<T>(this IEnumerable<T> enumerable, int chunkSize)
{
    int itemsReturned = 0;
    var list = enumerable.ToList(); // Prevent multiple execution of IEnumerable.
    int count = list.Count;
    while (itemsReturned < count)
    {
        int currentChunkSize = Math.Min(chunkSize, count - itemsReturned);
        yield return list.GetRange(itemsReturned, currentChunkSize);
        itemsReturned += currentChunkSize;
    }
}

之后,请按如下方式使用:

int rowCount = 1;
int chunkSize = 50000;
using (ExcelPackage objExcelPackage = new ExcelPackage()) 
{ 
    ExcelWorksheet objWorksheet = objExcelPackage.Workbook.Worksheets.Add("Conversion Data"); 
    //objWorksheet.Cells["A1"].LoadFromDataTable(FinalResult, true);
    foreach (var smallerTable in FinalResult.AsEnumerable().ToChunks(chunkSize))
    {
        objWorksheet.Cells["A" + rowCount].LoadFromDataTable(smallerTable, true);
        rowCount += chunkSize;
    }

基本上,rowCount用于跟踪Excel工作表中添加行的位置,每次迭代后将为1,50001,100001等插入A1,A50001,A100001等。

如果内存仍然存在错误,请尝试越来越小的chunkSize直到它工作。