2017-09-22 27 views
-1

私は200,000行のDataTableを持っています。C#でExcelにエクスポートするとSystem.OutOfMemoryExceptionが発生します

エクセルファイルにDataTableをエクスポートします。しかし、System.OutOfMemoryExceptionというエラーが出ます。

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

エクスポートに使用した関連コードを表示してください。 –

+0

using(ExcelPackage objExcelPackage = new ExcelPackage()) { ExcelWorksheet objWorksheet = objExcelPackage.Workbook.Worksheets.Add( "変換データ"); objWorksheet.Cells ["A1"]。LoadFromDataTable(FinalResult、true); –

+0

ExcelPackageは、少なくとも2年以内に更新されていない第三者のライブラリのようです。なぜあなたは適切なOpenXML SDKを使用していませんか? – Equalsk

答えて

0

This answer(ジェネリックしかし、DataTableのでは動作します)小さなチャンクにDataTableのを分割する方法を提供し、修正が必要な問題は、データテーブルの大きさであることから、このようなものは動作するはずです:

その後
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が各ITERの後、行を追加する場所Excelシート上のトラックを維持することです1、50001、100001などでA1、A50001、A100001などに挿入します。

メモリにエラーが残っている場合は、動作するまでchunkSizeを小さくしてください。

+0

なぜデータテーブルのサイズが問題であると思われますか? –

関連する問題