2017-04-18 125 views
0

好吧,所以我想加载一个CSVStream到ExcelPackage(我正在使用EPPlus)。EPPlus阵列尺寸超出支持的范围。 System.OutOfMemoryException

无论我选择什么选项,它总是在第221482行失败。我在x64运行,我在我的app.config ...

给出的错误是从标题:(

public ExcelPackage ExcelPackageFromCsvStream(Stream csvStream) 
    { 
     var excelPackage = new ExcelPackage(); 
     var workSheet = excelPackage.Workbook.Worksheets.Add("Sheet1"); 

     var csvFormat = new ExcelTextFormat 
     { 
      Delimiter = ',', 
      TextQualifier = '"', 
      DataTypes = new[] { eDataTypes.String } 
     }; 

     using (var sr = new StreamReader(csvStream)) 
     { 
      int i = 1; 
      foreach (var line in sr.ReadLines("\r\n")) 
      { 
       workSheet.Cells["A" + i].LoadFromText(line, csvFormat); 
       i++; 
      } 
     } 

     return excelPackage; 
    } 

回答

0

通过创建多个ExcelPackages解决它,我也读过一分批流(例如,一次200k行)

public List<ExcelPackage> ExcelPackagesFromCsvStream(Stream csvStream, int batchSize) 
    { 
     var excelPackages = new List<ExcelPackage>(); 
     int currentPackage = -1; // so that first package will have the index 0 

     var csvFormat = new ExcelTextFormat 
     { 
      Delimiter = ',', 
      TextQualifier = '"', 
      DataTypes = new[] {eDataTypes.String} 
     }; 


     using (var sr = new StreamReader(csvStream)) 
     { 
      int index = 1; 

      foreach (var line in sr.ReadLines("\r\n")) 
      { 
       if ((index - 1) % batchSize == 0) 
       { 
        var excelPackage = new ExcelPackage(); 
        excelPackage.Workbook.Worksheets.Add("Sheet1"); 

        excelPackages.Add(excelPackage); 
        currentPackage++; 
        index = 1; 
       } 

       excelPackages[currentPackage].Workbook.Worksheets.First().Cells["A" + index].LoadFromText(line, csvFormat); 
       index++; 
      } 
     } 

     return excelPackages; 
    }