我有一个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);
}
答案 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直到它工作。