Используйте EPPlus для экспорта результатов динамического запроса в Excel - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть приложение, в котором пользователи вводят большое количество полей данных и затем хотят создавать электронные таблицы Excel из пользовательских запросов к данным.

Для запросов из одной таблицы я могу вернуть IEnumerable<T> и использовать метод LoadFromCollection() в EPPlus для создания электронной таблицы только с запрошенными столбцами, например:

List<string> fieldNames = userFieldsParam;

var data = Entities.MainStatements
           .Where(ms => ms.FinancialYear.YearString == finYearParam);
var displayFields = typeof(MainStatements).GetMembers()
                    .Where(st => fieldNames.Contains(st.Name)).ToList();

worksheet.Cells["a2"].LoadFromCollection(data, false, OfficeOpenXm.Table.TableStyles.None, 
                      BindingFlags.Default, displayFields.ToArray());

Однакопоскольку запросы пользователей охватывают связанные таблицы, мой запрос возвращает динамический класс (не IEnumerable<T>), который не загружается.

var data = Entities.MainStatements
           .Include(RevenueStatements)
           .Include(ExpenditureStatements)
           .Where(ms => ms.FinancialYear.YearString == finYearParam)
           .Select(fieldNamesString);

Я пытался использовать решение (OP) здесь , возвращая IEnumerable со всеми столбцами (включая .Include d столбцов таблицы), но не может понять, как получить данные MemberInfo из связанных таблиц.Сначала я попытался включить имя таблицы в запрошенный список столбцов, но GetMembers () не добавил их.

Затем я попытался создать MemberInfo для каждой из отдельных таблиц, но когда попыталсядобавив информацию об имени таблицы, чтобы объединить их в один список, я обнаружил, что MemberInfo только для чтения.

foreach (MemberInfo mi in typeof(RevenueStatements).GetMembers().Where(rs => fieldNames.Contains(rs.Name)))
{ 
  mi.Name = "RevenueStatements." + mi.Name;     <-- Property or indexer mi
  displayFields.Add(mi);
} 

Как заполнить электронную таблицу Excel из результата запроса нескольких таблиц пользовательскими столбцами с помощью EPPlus (или другого решения стороннего производителя)?В частности, как мне указать EPPlus, какие столбцы следует включить из связанных таблиц?

1 Ответ

0 голосов
/ 04 февраля 2019

Создайте DataTable, используя ваши результаты, и напишите в Excel, используя метод EPPlus LoadFromDataTable ();

...