【发布时间】:2016-10-14 14:24:25
【问题描述】:
我在使用 NReco ExcelPivotTableWriter
创建数据透视表时遇到系统内存不足异常 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);
}
}
创建范围数据透视表时出错
var rangePivotTable = wsData.Cells["A1"].LoadFromDataTable(tbl, false);
LazyTotal 模式为真
var ordersPvtData = new PivotData(dimentionsArray, composite, true);
数据集有 200k 行。我认为这并不过分。我在 Windows 10 上有 8 GB 内存。 NReco 是免费版本。 有什么解决办法吗?
【问题讨论】:
-
首先确保您的 .net 程序作为 x64 应用程序执行并且可以使用所有可用内存。然后,尝试减少为 PivotData 类配置的维数。 ExcelPivotTableWriter 使用 EPPlus 库导出到 Excel 数据透视表,根据数据集大小,它确实会消耗大量 RAM。
-
我的应用程序作为 AnyCpu 运行
标签: c# asp.net pivot-table nreco