Экспорт IEnumerable <T> в Excel

Кто-нибудь знает, как или какую библиотеку использовать для этого?

Ответ 2

Ниже приведен код, который я использую для преобразования IEnumerable<T> в DataTable, содержащий столбцы с именем для каждого свойства, а также значения каждого элемента в IEnumerable в виде строк. Это очень маленький прыжок из этого, чтобы сохранить его как файл CSV

public class IEnumerableToDataTable
{
    public  static DataTable CreateDataTableForPropertiesOfType<T>()
    {
        DataTable dt = new DataTable();
        PropertyInfo[] piT = typeof(T).GetProperties();

        foreach (PropertyInfo pi in piT)
        {
            Type propertyType = null;
            if (pi.PropertyType.IsGenericType)
            {
                propertyType = pi.PropertyType.GetGenericArguments()[0];
            }
            else
            {
                propertyType = pi.PropertyType;
            }
            DataColumn dc = new DataColumn(pi.Name, propertyType);

            if (pi.CanRead)
            {
                dt.Columns.Add(dc);
            }
        }

        return dt;
    }

    public static DataTable ToDataTable<T>(IEnumerable<T> items)
    {
        var table = CreateDataTableForPropertiesOfType<T>();
        PropertyInfo[] piT = typeof(T).GetProperties();

        foreach (var item in items)
        {
            var dr = table.NewRow();

            for (int property = 0; property < table.Columns.Count; property++)
            {
                if (piT[property].CanRead)
                {
                    dr[property] = piT[property].GetValue(item, null);
                }
            }

            table.Rows.Add(dr);
        }
        return table;
    }
}

Итак, вы можете написать следующее, чтобы преобразовать ваши данные в datatable:

IEnumerable<Thing> values = GetMyIEnumerableValues();

var tableOfData = IEnumerableToDataTable.ToDataTable(values);

После этого достаточно просто записать его в файл CSV или любой другой формат по вашему выбору, так как все "сложные" работы по отражению данных из IEnumerable<T> были выполнены.

Ответ 3

Я решил проблему аналогичную, как вы просили. Как у вас есть IEnumerable

IEnumerable<TaskSheetHead> taskSheetHead = new TaskSheetHeadService().GetEmployeeTimesheet(entity);

Итак, если вы хотите сделать превосходное от этого, просто создайте книгу

var workbook = new HSSFWorkbook();
var sheet = workbook.CreateSheet();

И повторите цикл с циклом, а затем добавьте его на рабочий лист

foreach (TaskSheetHead taskSheethead in taskSheetHead)
            {
                //decimal totalTask = decimal.Zero;
                //double totalTime = 0;

                foreach (TaskSheet taskSheet in taskSheethead.TaskSheets)
                {
                    var row2 = sheet.CreateRow(rowNumber++);
                    row2.CreateCell(0).SetCellValue(taskSheethead.Date.ToString("MMMM dd, yyyy"));
                    row2.CreateCell(1).SetCellValue(taskSheet.Task.Project.ProjectName + ":" + taskSheet.Task.Title + "-" + taskSheet.Comment);
                    row2.CreateCell(2).SetCellValue(taskSheet.ExpendedHour);
                    row2.CreateCell(3).SetCellValue(taskSheet.IsBilledToClient);
                    //totalTask += 1;
                    //totalTime += taskSheet.ExpendedHour;
                }
                var row3 = sheet.CreateRow(rowNumber++);
                row3.CreateCell(0).SetCellValue("");
                row3.CreateCell(1).SetCellValue("");
                row3.CreateCell(2).SetCellValue("");
                row3.CreateCell(3).SetCellValue("");

            }

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