Si te encuentras con alguna parte que te causa duda puedes dejarlo en los comentarios y te ayudaremos lo más rápido posible.
Solución:
Kit de inicio
Primero he descargado el Formato XML abierto SDK 2.0.
Viene con 3 herramientas útiles en:
C:Archivos de programaOpen XML Format SDKV2.0tools
DocumentReflector.exe
que genera automáticamente el C# para crear una hoja de cálculo a partir del código.OpenXmlClassesExplorer.exe
mostrar la especificación Ecma y la documentación de la clase (utilizando un formato de estilo MSDN).OpenXmlDiff.exe
compare gráficamente dos archivos Open XML y busque errores.
Sugiero a cualquiera que comience a rebautizar.xlsxpara.Código Postalpara que pueda ver los archivos XML que manejan nuestra hoja de cálculo (por ejemplo, nuestras hojas están en “xlworksheets”).
El código
Descargo de responsabilidad : He robado todo el código de un Artículo técnico de MSDN ;D
El siguiente código usa una plantilla *.xlsx que hice manualmente para poder modificarla.
Referencias de espacios de nombres
using System.IO;
using System.Xml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using DocumentFormat.OpenXml;
// Database object
DataClassesDataContext db = new DataClassesDataContext();
// Make a copy of the template file.
File.Copy(@"C:inetpubwwwrootproject.WebClientsHandlersoxml-tpllivreurs.xlsx", @"C:inetpubwwwrootproject.WebClientsHandlersoxml-tplgenerated.xlsx", true);
// Open the copied template workbook.
using (SpreadsheetDocument myWorkbook = SpreadsheetDocument.Open(@"C:inetpubwwwrootproject.WebClientsHandlersoxml-tplgenerated.xlsx", true))
// Access the main Workbook part, which contains all references.
WorkbookPart workbookPart = myWorkbook.WorkbookPart;
// Get the first worksheet.
WorksheetPart worksheetPart = workbookPart.WorksheetParts.ElementAt(2);
// The SheetData object will contain all the data.
SheetData sheetData = worksheetPart.Worksheet.GetFirstChild();
// Begining Row pointer
int index = 2;
// Database results
var query = from t in db.Clients select t;
// For each item in the database, add a Row to SheetData.
foreach (var item in query)
// Cell related variable
string Nom = item.Nom;
// New Row
Row row = new Row();
row.RowIndex = (UInt32)index;
// New Cell
Cell cell = new Cell();
cell.DataType = CellValues.InlineString;
// Column A1, 2, 3 ... and so on
cell.CellReference = "A"+index;
// Create Text object
Text t = new Text();
t.Text = Nom;
// Append Text to InlineString object
InlineString inlineString = new InlineString();
inlineString.AppendChild(t);
// Append InlineString to Cell
cell.AppendChild(inlineString);
// Append Cell to Row
row.AppendChild(cell);
// Append Row to SheetData
sheetData.AppendChild(row);
// increase row pointer
index++;
// save
worksheetPart.Worksheet.Save();
Todavía no he terminado, mi segundo trabajo es descargar automáticamente la hoja de cálculo después de la modificación.
Finalmente, redirijo al usuario a mi hoja de cálculo generada (desde mi aspx)
context.Response.Redirect("Oxml-tpl/generated.xlsx");
simplemente configure Response.ContentType = “application/vnd.ms-excel” y su página se representará como una hoja de Excel en el navegador del cliente
Ejemplo de código aquí
Te invitamos a corroborar nuestra faena fijando un comentario o dejando una puntuación te lo agradecemos.