2010-07-26 2 views
10

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

+3

Вам нужен он для экспорта на лету? если нет, то подумайте о сохранении в формате csv – ULysses

+1

Вам нужно экспортировать в файл Excel или CSV быть приемлемым? – Rob

+3

Этот вид зависит от T :) – SWeko

ответ

14

Код, приведенный ниже, является кодом, который я использую для преобразования 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> были выполнены.

1

Я решил проблему подобную, как вы просили. Как у вас есть 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(""); 

      } 

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