2016-10-14 4 views
0

Я получаю систему из исключения памяти при создании сводной таблицы с NReco ExcelPivotTableWriterPivot Excel С NReco, система Из Exception памяти

public void Write(PivotTable pvtTbl) 
     { 
      var tbl = getPivotDataAsTable(pvtTbl.PivotData); 
      var rangePivotTable = wsData.Cells["A1"].LoadFromDataTable(tbl, false); 

      var pivotTable = ws.PivotTables.Add(
        ws.Cells[1, 1], 
        rangePivotTable, "pvtTable"); 

      foreach (var rowDim in pvtTbl.Rows) 
       pivotTable.RowFields.Add(pivotTable.Fields[rowDim]); 
      foreach (var colDim in pvtTbl.Columns) 
       pivotTable.ColumnFields.Add(pivotTable.Fields[colDim]); 

      pivotTable.ColumGrandTotals = false; 
      pivotTable.DataOnRows = false; 
      pivotTable.ColumGrandTotals = false;    
      pivotTable.RowGrandTotals = false; 


      if (pvtTbl.PivotData.AggregatorFactory is CompositeAggregatorFactory) 
      {     
       var aggrFactories = ((CompositeAggregatorFactory)pvtTbl.PivotData.AggregatorFactory).Factories; 
       for (int i = 0; i < aggrFactories.Length; i++) 
       { 
        var dt = pivotTable.DataFields.Add(pivotTable.Fields[String.Format("value_{0}", i)]); 
        dt.Function = SuggestFunction(aggrFactories[i]); 

        string columnName = ""; 
        if (dt.Function == OfficeOpenXml.Table.PivotTable.DataFieldFunctions.Sum) 
          columnName = ((NReco.PivotData.SumAggregatorFactory)aggrFactories[i]).Field; 
        else if(dt.Function == OfficeOpenXml.Table.PivotTable.DataFieldFunctions.Average) 
         columnName = ((NReco.PivotData.AverageAggregatorFactory)aggrFactories[i]).Field; 

        if (columnNames.ContainsKey(columnName)) 
         dt.Name = columnNames[columnName].ToString(); 
        else 
         dt.Name = aggrFactories[i].ToString();        
       } 
      } 
      else 
      { 
       pivotTable.DataFields.Add(pivotTable.Fields["value"]).Function = SuggestFunction(pvtTbl.PivotData.AggregatorFactory); 
      } 

     } 

встретилась ошибка при создании rangePivotTable

var rangePivotTable = wsData.Cells["A1"].LoadFromDataTable(tbl, false); 

Режим LazyTotal является истинным

var ordersPvtData = new PivotData(dimentionsArray, composite, true); 

Набор данных имеет 200 тыс. Строк. Это не слишком много, я думаю. У меня 8 ГБ бара на окнах 10. NReco - бесплатная версия. Любое решение?

+0

Прежде всего убедитесь, что ваша программа .net выполнена как приложение x64 и может использовать всю доступную память. Затем попытайтесь уменьшить количество измерений, настроенных для класса PivotData. ExcelPivotTableWriter использует библиотеку EPPlus для экспорта в Excel PivotTable, и на самом деле она может потреблять много ОЗУ в зависимости от размера набора данных. –

+0

мое приложение работает как AnyCpu –

ответ

0

8G может быть недостаточно физической памяти в зависимости от того, насколько велика каждая из 200-килобайтных строк и потребление памяти других приложений, работающих в вашей системе.

Перед запуском этой программы запустите диспетчер задач Windows и перейдите на вкладку «Производительность».

enter image description here

Обратите внимание на доступные и бесплатные значениях памяти. Затем запустите свою программу и посмотрите, как потребляется память. Если ваша программа действительно потребляет всю вашу свободную память, тогда ваши варианты ...

  1. Освободите больше памяти, удалив другие приложения, которые потребляют память.
  2. Добавить физическую память в вашу систему.
  3. Измените свою программу, чтобы сделать ее более эффективной. (включая удаление утечек памяти)
  4. Некоторая комбинация из трех предыдущих вариантов.
0

Вы можете легко нарезать строки 200k. Попробуй так. , ,

Workbook workbook = new Workbook(); 
workbook.LoadFromFile(@"C:\your_path_here\SampleFile.xlsx"); 
Worksheet sheet = workbook.Worksheets[0]; 
sheet.Name = "Data Source"; 
Worksheet sheet2 = workbook.CreateEmptySheet(); 
sheet2.Name = "Pivot Table"; 
CellRange dataRange = sheet.Range["A1:G200000"]; 
PivotCache cache = workbook.PivotCaches.Add(dataRange); 
PivotTable pt = sheet2.PivotTables.Add("Pivot Table", sheet.Range["A1"], cache); 
var r1 = pt.PivotFields["Vendor No"]; 
r1.Axis = AxisTypes.Row; 
pt.Options.RowHeaderCaption = "Vendor No"; 

var r2 = pt.PivotFields["Description"]; 
r2.Axis = AxisTypes.Row; 
pt.DataFields.Add(pt.PivotFields["OnHand"], "SUM of OnHand", SubtotalTypes.Sum); 
pt.DataFields.Add(pt.PivotFields["OnOrder"], "SUM of OnOrder", SubtotalTypes.Sum); 
pt.DataFields.Add(pt.PivotFields["ListPrice"], "Average of ListPrice", SubtotalTypes.Average); 

pt.BuiltInStyle = PivotBuiltInStyles.PivotStyleMedium12; 
workbook.SaveToFile("PivotTable.xlsx", ExcelVersion.Version2010); 
System.Diagnostics.Process.Start("PivotTable.xlsx"); 

 Смежные вопросы

  • Нет связанных вопросов^_^