C# 打开XML SDK数据透视-如何延迟数据透视缓存记录的枚举?
我正在尝试合并多个excel工作簿,这些工作簿中不包含数据源。由于我无法控制的原因,我无法访问驾驶数据 每个工作簿始终只包含一个数据透视表,并且它们可靠地共享某些字段。理想情况下,用户可以选择一组字段和一个工作簿列表,并将得到一个包含所有组合数据的工作簿。我并没有迷失方向,这不是做事情的正确方式,而是我得到的那只手 问题 当我寻址PivotTableCacheRecordsArt的PivotCacheRecords属性的任意成员时,它会立即将整个列表枚举到内存中。由于某些工作表有数万行和50多列,这会很快消耗所有可用内存。下面是一个例子snippitC# 打开XML SDK数据透视-如何延迟数据透视缓存记录的枚举?,c#,pivot,openxml,openxml-sdk,pivot-table,C#,Pivot,Openxml,Openxml Sdk,Pivot Table,我正在尝试合并多个excel工作簿,这些工作簿中不包含数据源。由于我无法控制的原因,我无法访问驾驶数据 每个工作簿始终只包含一个数据透视表,并且它们可靠地共享某些字段。理想情况下,用户可以选择一组字段和一个工作簿列表,并将得到一个包含所有组合数据的工作簿。我并没有迷失方向,这不是做事情的正确方式,而是我得到的那只手 问题 当我寻址PivotTableCacheRecordsArt的PivotCacheRecords属性的任意成员时,它会立即将整个列表枚举到内存中。由于某些工作表有数万行和50多列
var pivotDefs = spredDoc.WorkbookPart.PivotTableCacheDefinitionParts.First();
...
int i = 0;
var records = pivotDefs.PivotTableCacheRecordsPart.PivotCacheRecords;
foreach(var record in records)
{
var fields = record.ToList();
lastUsedRow++;
for (int j = 0; j < fieldCount; j++)
{
if (reportToDefColumnLookup.ContainsKey(j) && !(fields[j] is MissingItem))
{
var readValue = fields[j].GetAttribute("v", "").Value;
writer.Write(readValue + "\t");
}
else
{
writer.Write("\t");
}
}
writer.WriteLine();
i++;
if (i % 2000 == 0)
{
System.Diagnostics.Trace.WriteLine(string.Format("[Pivot Handler] {0} records read", i.ToString()));
}
}
var pivotDefs=spredDoc.WorkbookPart.PivotTableCacheDefinitionParts.First();
...
int i=0;
var records=pivotDefs.PivotTableCacheRecordsPart.pivottcacherecords;
foreach(记录中的var记录)
{
var fields=record.ToList();
lastUsedRow++;
对于(int j=0;j
当“记录”被寻址时(在本例中,当foreach逻辑调用其枚举器时,但您可以通过调用任何成员属性/函数来复制该行为),整个列表将加载到内存中。理想的解决方案是读取每条记录并在读取后卸载它。我试图从列表中删除该元素,但似乎没有任何效果
我有一个非常模糊的想法,就是在不复制表格数据的情况下,以某种方式合并两个pivot定义,但我不知道如何去做
我没有这方面的预算。任何图书馆的建议都必须是免费的。我已经研究过ePlus,但它没有很好的数据透视表支持
有谁能解释这一点,或者给我指出一个可能的方向?众所周知,开放式XML文档很难找到,而且充其量也很神秘
提前谢谢