2010-07-26 23 views
10

¿alguien sabe cómo o alguna biblioteca usar para esto?exportar IEnumerable <T> a Excel

+3

¿lo necesita para exportar sobre la marcha? de lo contrario, considere guardar en formato csv – ULysses

+1

¿Necesita exportar a un archivo de Excel o CSV sería aceptable? – Rob

+3

Esto depende de la T :) – SWeko

Respuesta

14

El código siguiente es el código que uso para convertir un IEnumerable<T> en una DataTable que contiene columnas nombradas para cada propiedad, junto con los valores de cada elemento en IEnumerable como filas. Es un pequeño salto de este a guardarlo como un archivo 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; 
    } 
} 

Por lo tanto, se podría escribir lo siguiente para convertir sus datos a una tabla de datos:

IEnumerable<Thing> values = GetMyIEnumerableValues(); 

var tableOfData = IEnumerableToDataTable.ToDataTable(values); 

Una vez que está ahí, es bastante trivial para escribirlo en un archivo CSV, o en cualquier otro formato de su elección, ya que se ha realizado todo el trabajo de reflexión "complicado" para extraer los datos del IEnumerable<T>.

1

que han resuelto un problema similar como lo pediste. Como que tiene un IEnumerable

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

Así que si usted quiere hacer un Excel de esta simplemente crear un libro

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

Y iterar con un bucle y luego añadirlo a la hoja de trabajo

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(""); 

      } 

Aquí tengo otra lista secundaria, por lo tanto, he iterado usando un ciclo interno. Haz lo que quieras

Cuestiones relacionadas