open xml sdk 将dataTable写入Excel 并下载 FileStrem
1 /// <summary> 2 /// 将集合类转换成DataTable 3 /// </summary> 4 /// <param name="list">集合</param> 5 /// <returns></returns> 6 public static DataTable ToDataTableTow(List<ElectronicReceiptModel> list) 7 { 8 DataTable result = new DataTable(); 9 if (list.Count > 0) 10 { 11 PropertyInfo[] propertys = list[0].GetType().GetProperties(); 12 13 foreach (PropertyInfo pi in propertys) 14 { 15 result.Columns.Add(pi.Name, pi.PropertyType); 16 } 17 for (int i = 0; i < list.Count; i++) 18 { 19 ArrayList tempList = new ArrayList(); 20 foreach (PropertyInfo pi in propertys) 21 { 22 object obj = pi.GetValue(list[i], null); 23 tempList.Add(obj); 24 } 25 object[] array = tempList.ToArray(); 26 result.LoadDataRow(array, true); 27 } 28 } 29 return result; 30 }
/// <summary> /// 创建excel,并且把dataTable导入到excel中 /// </summary> /// <param name="destination">保存路径</param> /// <param name="table">数据源</param> public static MemoryStream CreateExcel(DataTable table) { MemoryStream stream = new MemoryStream(); using (var workbook = SpreadsheetDocument.Create(stream, DocumentFormat.OpenXml.SpreadsheetDocumentType.Workbook)) { var workbookPart = workbook.AddWorkbookPart(); workbook.WorkbookPart.Workbook = new DocumentFormat.OpenXml.Spreadsheet.Workbook(); workbook.WorkbookPart.Workbook.Sheets = new DocumentFormat.OpenXml.Spreadsheet.Sheets(); uint sheetId = 1; bool isAddStyle = false; //foreach (DataTable table in dataTables) //{ var sheetPart = workbook.WorkbookPart.AddNewPart<WorksheetPart>(); var sheetData = new SheetData(); sheetPart.Worksheet = new Worksheet(); if (!isAddStyle) { var stylesPart = workbook.WorkbookPart.AddNewPart<WorkbookStylesPart>(); Stylesheet styles = new CustomStylesheet(); styles.Save(stylesPart); isAddStyle = true; } //Columns headColumns = CrateColunms(table); //sheetPart.Worksheet.Append(headColumns); DocumentFormat.OpenXml.Spreadsheet.Sheets sheets = workbook.WorkbookPart.Workbook.GetFirstChild<DocumentFormat.OpenXml.Spreadsheet.Sheets>(); string relationshipId = workbook.WorkbookPart.GetIdOfPart(sheetPart); if (sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Count() > 0) { sheetId = sheets.Elements<DocumentFormat.OpenXml.Spreadsheet.Sheet>().Select(s => s.SheetId.Value).Max() + 1; } string sheetName = "电子单"; DocumentFormat.OpenXml.Spreadsheet.Sheet sheet = new DocumentFormat.OpenXml.Spreadsheet.Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName }; sheets.Append(sheet);//创建表 DocumentFormat.OpenXml.Spreadsheet.Row headerRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); List<String> columns = new List<string>(); foreach (DataColumn column in table.Columns) { columns.Add(column.ColumnName); DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; cell.StyleIndex = 11; cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(column.ColumnName); headerRow.AppendChild(cell); } sheetData.AppendChild(headerRow);//创建表头 foreach (DataRow dsrow in table.Rows) { DocumentFormat.OpenXml.Spreadsheet.Row newRow = new DocumentFormat.OpenXml.Spreadsheet.Row(); foreach (String col in columns) { DocumentFormat.OpenXml.Spreadsheet.Cell cell = new DocumentFormat.OpenXml.Spreadsheet.Cell(); cell.DataType = DocumentFormat.OpenXml.Spreadsheet.CellValues.String; cell.StyleIndex = 10; cell.CellValue = new DocumentFormat.OpenXml.Spreadsheet.CellValue(dsrow[col].ToString()); // newRow.AppendChild(cell); } sheetData.AppendChild(newRow); } sheetPart.Worksheet.Append(sheetData);//创建单元格 workbook.Close(); } stream.Position = 0; return stream; }
//字符流的形式下载Excel
1 DataTable table = ElectronicReceiptView.ToDataTableTow(proList); 2 var stream= ElectronicReceiptView.CreateExcel(table); 3 return File(stream, "application/ms-excel", name);