Office Open XML es un formato de archivo abierto y estándar cuyas extensiones más comunes son .docx, .xlsx y .pptx. Principalmente contiene datos en XML comprimidos en un .zip. .NET dispone de librerias capaces de trabajar con este formato y de esta manera prescindir de instalar Office y sus temidas Microsoft.Office.Interop.
Generar archivos Excel en C# con Open XML
Para la demo es necesario instalar el paquete DocumentFormat.OpenXml:
O desde la consola de Nuget:
1 | Install-Package DocumentFormat.OpenXml |
El código es el siguiente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | namespace SaveExcelApp { public static class SaveExcel { public static void BuildExcel(DataTable dataTable, string ExcelPath) { using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Create(ExcelPath, SpreadsheetDocumentType.Workbook)) { // workbook Part WorkbookPart workbookPart = myWorkbook.AddWorkbookPart(); var worksheetPart = workbookPart.AddNewPart<WorksheetPart>(); string relId = workbookPart.GetIdOfPart(worksheetPart); // file Version var fileVersion = new FileVersion { ApplicationName = "Microsoft Office Excel" }; // sheets var sheets = new Sheets(); var sheet = new Sheet { Name = dataTable.TableName, SheetId = 1, Id = relId }; sheets.Append(sheet); // data SheetData sheetData = new SheetData(CreateSheetData(dataTable)); // add the parts to the workbook and save var workbook = new Workbook(); workbook.Append(fileVersion); workbook.Append(sheets); var worksheet = new Worksheet(); worksheet.Append(sheetData); worksheetPart.Worksheet = worksheet; worksheetPart.Worksheet.Save(); myWorkbook.WorkbookPart.Workbook = workbook; myWorkbook.WorkbookPart.Workbook.Save(); myWorkbook.Close(); } } private static List<OpenXmlElement> CreateSheetData(DataTable dataTable) { List<OpenXmlElement> elements = new List<OpenXmlElement>(); // row header var rowHeader = new Row(); Cell[] cellsHeader = new Cell[dataTable.Columns.Count]; for (int i = 0; i < dataTable.Columns.Count; i++) { cellsHeader[i] = new Cell(); cellsHeader[i].DataType = CellValues.String; cellsHeader[i].CellValue = new CellValue(dataTable.Columns[i].ColumnName); } rowHeader.Append(cellsHeader); elements.Add(rowHeader); // rows data foreach (DataRow rowDataTable in dataTable.Rows) { var row = new Row(); Cell[] cells = new Cell[dataTable.Columns.Count]; for (int i = 0; i < dataTable.Columns.Count; i++) { cells[i] = new Cell(); cells[i].DataType = CellValues.String; cells[i].CellValue = new CellValue((string)rowDataTable[i]); } row.Append(cells); elements.Add(row); } return elements; } } } |
Para mi demo los datos que deseo guardar en el archivo Excel los tengo en un DataTable. Al método BuildExcel se le pasa el DataTable con los datos y la ruta completa del archivo Excel a generar. El método CreateSheetData se encarga de leer los datos del DataTable y generar las celdas. El nombre de la hoja Excel se obtiene del nombre de la tabla.
Se trata de un código sencillo pero que puede servir como punto de partida.
Y ahora una pequeña demo:
1 2 3 4 5 6 7 8 | var demoTable = new DataTable("mi demo"); demoTable.Columns.Add("name"); demoTable.Columns.Add("surname"); demoTable.Columns.Add("favorite color"); demoTable.Rows.Add(new Object[] { "David", "Miro", "blue" }); demoTable.Rows.Add(new Object[] { "Pablo", "Iglesias", "yellow" }); demoTable.Rows.Add(new Object[] { "Ratoncito", "Perez", "green" }); SaveExcel.BuildExcel(demoTable, "demo.xlsx"); |
Y el archivo generado:
Enlace a la demo: SaveExcel.zip