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:
Install-Package DocumentFormat.OpenXml
El código es el siguiente:
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();
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 CreateSheetData(DataTable dataTable)
{
List elements = new List();
// 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:
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