Open XML SDK Pivots - Как отложить перечисление PivotCacheRecords? - PullRequest
2 голосов
/ 05 ноября 2011

Я пытаюсь объединить несколько книг Excel, в которые не включен источник данных.По независящим от меня причинам у меня нет средств для доступа к данным вождения.

Каждая рабочая книга всегда содержит ровно одну сводную таблицу, и они надежно разделяют определенные поля.В идеале пользователь может выбрать группу полей и список рабочих книг и получить одну рабочую книгу со всеми объединенными данными.Это не потеряно для меня, это не правильный способ сделать что-то, но это рука, с которой я столкнулся.

Проблема;

Когда я обращаюсь к любому члену свойства PivotCacheRecordsPivotTableCacheRecordsPart, он мгновенно перечисляет весь список в память.Из-за того, что некоторые листы имеют десятки тысяч строк и более 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()));
    }                               
  }

Момент «записи» адресован (в этом случае, когда логика foreach вызывает свой перечислитель - но вы можете повторить поведение, вызвав любое свойство / функцию члена)весь список загружается в память.Идеальное решение - прочитать каждую запись и выгрузить ее после прочтения.Я попытался удалить элемент из списка, но, похоже, он не дал никакого эффекта.

У меня очень смутное представление о том, как объединить два определения сводных данных без воспроизведения табличных данных, но я понятия не имею, как это сделать.

У меня нет бюджета для этого.Любые предложения библиотеки должны быть бесплатными.Я исследовал EPPlus, но у него нет очень хорошей поддержки сводной таблицы.

Может ли кто-нибудь пролить свет на это или указать мне возможное направление?Документация по открытому XML, как известно, трудна для поиска и в лучшем случае имеет загадочный характер.

Заранее спасибо.

...