Помогите преобразовать общий список <T>в электронную таблицу Excel - PullRequest
4 голосов
/ 02 декабря 2009

Я пытаюсь создать функцию, которая принимает общий List<T> и повторяет список, возвращая файл Excel byte[]. Функция должна иметь возможность определять свойства объектов. Поэтому, если я передаю List<person>, и у человека есть свойства first, last, age и т. Д., Мне нужно иметь возможность определять имена свойств, чтобы создавать заголовки столбцов Excel, а затем мне нужно повторять список, чтобы назначить значения свойств. к ячейкам столбца. Может кто-нибудь указать мне пример кода для работы с List<T> в универсальной функции?

Ответы [ 3 ]

9 голосов
/ 02 декабря 2009

В сторону: для возврата столбцов в известном порядке: там равно нет определенного порядка для элементов, кроме того, который вы создаете. Например ( из MSDN ):

Метод GetProperties не возвращает свойства в определенном порядке, например в алфавитном порядке или в порядке объявления. Ваш код не должен зависеть от порядка, в котором возвращаются свойства, потому что этот порядок варьируется.

Если вам не нужно полагаться на порядок, подойдет либо отражение, либо TypeDescriptor; например (отмечая, что это пишет текст TSV, а не byte[] - моя интерпретация заключается в том, что проблема заключается в получении данных, а не в написании Excel):

static void WriteTsv<T>(this IEnumerable<T> data, TextWriter output)
{
    PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
    foreach (PropertyDescriptor prop in props)
    {
        output.Write(prop.DisplayName); // header
        output.Write("\t");
    }
    output.WriteLine();
    foreach (T item in data)
    {
        foreach (PropertyDescriptor prop in props)
        {
            output.Write(prop.Converter.ConvertToString(
                 prop.GetValue(item)));
            output.Write("\t");
        }
        output.WriteLine();
    }
}

Если вам нужен заказ , вам необходимо:

  • передать его (например, как params string[] propertyNames)
  • использовать атрибуты в свойствах
  • использовать алфавитный

Подход TypeDescriptor, описанный выше, имеет следующие преимущества (по сравнению с GetType().GetProperties()):

  • работает с пользовательскими объектными моделями (например, DataView, если вы используете IList)
  • вы можете настроить реализацию для повышения производительности - например, HyperDescriptor (полезно, если вы делаете это много)
0 голосов
/ 02 декабря 2009

Используйте интерфейс, который поддерживается вашей коллекцией, например IEnumerable:

public byte[] Process(IEnumerable input) {
    foreach (var elem in input) {
        foreach (PropertyInfo prop in elem.GetType().GetProperties()) {
            Object value = prop.GetValue(elem, null);
            // add value to byte[]
        }
    }
    return bytes;
}
0 голосов
/ 02 декабря 2009

Самый простой способ - преобразовать ваш Список в DataTable , затем преобразовать DataTable в электронную таблицу Excel .

Вторая ссылка записывает электронную таблицу непосредственно в ответ ASP.NET, ее можно легко адаптировать для возврата байта [].

...