Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 打开XML SDK数据透视-如何延迟数据透视缓存记录的枚举?_C#_Pivot_Openxml_Openxml Sdk_Pivot Table - Fatal编程技术网

C# 打开XML SDK数据透视-如何延迟数据透视缓存记录的枚举?

C# 打开XML SDK数据透视-如何延迟数据透视缓存记录的枚举?,c#,pivot,openxml,openxml-sdk,pivot-table,C#,Pivot,Openxml,Openxml Sdk,Pivot Table,我正在尝试合并多个excel工作簿,这些工作簿中不包含数据源。由于我无法控制的原因,我无法访问驾驶数据 每个工作簿始终只包含一个数据透视表,并且它们可靠地共享某些字段。理想情况下,用户可以选择一组字段和一个工作簿列表,并将得到一个包含所有组合数据的工作簿。我并没有迷失方向,这不是做事情的正确方式,而是我得到的那只手 问题 当我寻址PivotTableCacheRecordsArt的PivotCacheRecords属性的任意成员时,它会立即将整个列表枚举到内存中。由于某些工作表有数万行和50多列

我正在尝试合并多个excel工作簿,这些工作簿中不包含数据源。由于我无法控制的原因,我无法访问驾驶数据

每个工作簿始终只包含一个数据透视表,并且它们可靠地共享某些字段。理想情况下,用户可以选择一组字段和一个工作簿列表,并将得到一个包含所有组合数据的工作簿。我并没有迷失方向,这不是做事情的正确方式,而是我得到的那只手

问题

当我寻址PivotTableCacheRecordsArt的PivotCacheRecords属性的任意成员时,它会立即将整个列表枚举到内存中。由于某些工作表有数万行和50多列,这会很快消耗所有可用内存。下面是一个例子snippit

  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文档很难找到,而且充其量也很神秘

提前谢谢