EPPlus / как получить данные из сводной таблицы? Или как легко манипулировать данными?



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



Тогда другой подход. Для excel вывода отчетов я использую EPPlus. Он также поддерживает сводную таблицу. Проблема в том, что некоторые наши клиенты не имеют офиса (OpenOffice, MicrosoftOffice и т. д.), поэтому простое создание и сохранение файла xlsx не работает. Единственное, что я могу попробовать с EPPlus, это создать ExcelPackage, заполнение листа данными, а затем создание PivotTable с данными.

У меня есть несколько вопросов;



1) из этого объекта PivotTable я могу получить доступ к выходным данным PivotTable полей и значений. (До сих пор я не мог).



2) относящийся к вышеуказанному вопросу... Содержит ли файл xlsx данные о PivotTables или просто правила создания PivotTable (например, имя таблицы, sourceRange, поля строк, столбцы, поля данных, агрегированные параметры и т. д.). Я сделал небольшой тест на этот счет. Шаги как следующее:


  • открыл новый файл excel.

  • вставил некоторые необработанные данные.

  • создал сводную таблицу с данными.

  • изменил некоторые значения данных. (без обновления сводной таблицы)

  • сохранил и закрыл файл.

  • снова открыл файл.


На самом деле мое предположение было "сводная таблица будет обновляться в соответствии с новыми данными", но я ошибся. Он не обновлялся. Это может быть доказательством того, что " файл xlsx содержит не только правила для сводной таблицы, но и все ценности в нем". Если это так, у меня есть надежда получить доступ к этим данным без сохранения файла (и мне не нужны никакие офисные программы).

3) Любой другой подход приветствуется.

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

695   1  

1 ответ:

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

Если вы создаете новый xlsx в EEP, добавляете данные на рабочий лист, создаете сводную таблицу, указывающую на данные / рабочий лист, и сохраняете ее - то сводная таблица не содержит никаких данных. Он просто содержит определение того, как PT должен разрезать данные, когда файл открыт в excel (Как вы упомянули в одном из ваших вопросов).

Когда вы фактически открываете файл в excel и сохраняете его, excel копирует все данные, на которые опирается PT, и помещает их в кэш сводной таблицы. Вот почему вы можете удалить исходные ячейки, которые содержали данные, сохранить файл, а затем снова открыть его в excel (возможно, придется устранить некоторые ошибки), и по-прежнему видеть PT с данными. Вы даже можете дважды щелкнуть по одной из ячеек данных в PT, и excel восстановит некоторые или все (в зависимости от того, какую ячейку вы щелкните) из связанных данных в новый лист.

Да, ваше предположение было на самом деле неверным из-за этого кэша сводной таблицы. Вы должны сказать excel, чтобы обновить источник данных в соответствующей ленте (предполагая, что данные все еще там), чтобы увидеть новые данные появляются.

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

Создание фильтров сводной таблицы с помощью EPPLUS

Другой вариант-извлечь фактический рабочий лист.xml-файл из xlsx. Файл xlsx (и любой другой MS Office .???x-файлы) - это просто переименованные ZIP-файлы. Таким образом, вы можете использовать стандартные методы .NET для извлечения xml-файлов из zip и использовать что-то вроде LinqToXml для извлечения данных. Итак, что-то вроде этого:

var zip = new ExcelPackage(file).Package;
var recordspart = zip.GetPart(new Uri("/xl/worksheets/sheet1.xml", UriKind.Relative));
var recordsxml = XDocument.Load(recordspart.GetStream());

Это не будет довольно делать все манипуляции XML, но если окончательный формат XLSX будет не работать это может быть вашим лучшим вариантом.

Comments

    Ничего не найдено.