将IEnumerable <T>导出到Excel

任何人都知道如何或一些图书馆使用这个?

看看这里的图书馆部分:

从C#创buildExcel(.XLS和.XLSX)文件

在C#中创buildExcel电子表格.XLS和.XLSX

下面的代码是我用来将IEnumerable<T>转换为DataTable的代码,该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; } } 

所以,你可以编写下面的代码将数据转换为数据表:

 IEnumerable<Thing> values = GetMyIEnumerableValues(); var tableOfData = IEnumerableToDataTable.ToDataTable(values); 

一旦它在那里,把它写出来到一个CSV文件或者你select的任何其他格式是相当简单的,因为所有的“棘手的”reflection工作从IEnumerable<T>提取数据已经完成了。

我已经解决了类似的问题。 就像你有一个IEnumerable

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

所以如果你想从这个创build一个Excel,只需创build一个工作簿

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

在这里,我有另一个孩子列表,因此我已经迭代使用一个内部循环。 做你的select。