2010-07-26 43 views
10

bất kỳ ai biết cách sử dụng hoặc một số thư viện để sử dụng cho điều này?xuất IEnumerable <T> sang Excel

+3

bạn có cần nó để xuất trực tuyến không? nếu không, hãy xem xét lưu vào định dạng csv – ULysses

+1

Bạn có cần xuất sang tệp Excel hoặc CSV có thể chấp nhận không? – Rob

+3

Loại này phụ thuộc vào T :) – SWeko

Trả lời

14

Mã dưới đây là mã tôi sử dụng để chuyển đổi IEnumerable<T> thành một cột DataTable có tên cho mỗi thuộc tính, cùng với các giá trị của mỗi mục trong IEnumerable dưới dạng hàng. Đó là một hop rất nhỏ từ này để tiết kiệm nó như là một file 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; 
    } 
} 

Vì vậy, bạn có thể viết như sau để chuyển đổi dữ liệu của bạn vào một DataTable:

IEnumerable<Thing> values = GetMyIEnumerableValues(); 

var tableOfData = IEnumerableToDataTable.ToDataTable(values); 

Khi nó ở đó, nó khá tầm thường để viết nó ra một tệp CSV hoặc bất kỳ định dạng nào khác mà bạn chọn, vì tất cả công việc phản chiếu "phức tạp" để trích xuất dữ liệu từ IEnumerable<T> đã được thực hiện.

1

tôi đã giải quyết được một vấn đề tương tự như bạn hỏi. Giống như bạn có một IEnumerable

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

Vì vậy, nếu bạn muốn thực hiện một excel từ này chỉ cần tạo một workbook

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

Và lặp với một vòng lặp và sau đó thêm nó vào bảng

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

      } 

Ở đây tôi có một danh sách con khác, do đó tôi đã lặp lại bằng cách sử dụng vòng lặp bên trong. Làm như bạn lựa chọn.

Các vấn đề liên quan