2010-07-26 7 views
10

quelqu'un sait comment ou une bibliothèque à utiliser pour cela?exporter IEnumerable <T> à Excel

+3

avez-vous besoin d'une exportation à la volée? Si ce n'est pas le cas, pensez à enregistrer au format csv. – ULysses

+1

Avez-vous besoin d'exporter vers un fichier Excel ou le format CSV est-il acceptable? – Rob

+3

Ce genre dépend de la T :) – SWeko

Répondre

14

Le code ci-dessous est le code que j'utilise pour convertir un IEnumerable<T> en un DataTable contenant des colonnes nommées pour chaque propriété, ainsi que les valeurs de chaque élément dans IEnumerable en tant que lignes. Il est un saut très faible de ce à enregistrer en tant que fichier 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; 
    } 
} 

Ainsi, vous pouvez écrire ce qui suit pour convertir vos données à un datatable:

IEnumerable<Thing> values = GetMyIEnumerableValues(); 

var tableOfData = IEnumerableToDataTable.ToDataTable(values); 

Une fois qu'il est là, il est assez trivial pour l'écrire dans un fichier CSV, ou tout autre format de votre choix, car tout le travail de réflexion "difficile" pour extraire les données du IEnumerable<T> a été fait.

1

J'ai résolu un problème similaire comme vous avez demandé. Comme vous avez un IEnumerable

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

Donc, si vous voulez faire une excel à partir de ce juste créer un classeur

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

Et itérer avec une mise en boucle, puis l'ajouter à la feuille de calcul

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

      } 

Ici j'ai une autre liste d'enfants, donc j'ai itéré en utilisant une boucle interne. Faites comme votre choix.

Questions connexes