Después de mucho trabajar pudimos encontrar la solución de este inconveniente que muchos lectores de esta web presentan. Si tienes algún detalle que aportar no dudes en dejar tu comentario.
Solución:
He creado una clase que exporta un DataGridView
o DataTable
a un archivo de Excel. Probablemente pueda cambiarlo un poco para que use su DataSet
en su lugar (iterando a través del DataTables
en eso). También realiza un formato básico que también podría ampliar.
Para usarlo, simplemente llame a ExcelExport y especifique un nombre de archivo y si desea abrir el archivo automáticamente o no después de exportarlo. También podría haberlos hecho métodos de extensión, pero no lo hice. No dude en.
Tenga en cuenta que los archivos de Excel se pueden guardar como un documento XML glorificado y esto hace uso de eso.
EDITAR: Esto solía usar una vainilla StreamWriter
, pero como se señaló, las cosas no se escaparían correctamente en muchos casos. Ahora usa un XmlWriter
, que hará el escape por ti.
los ExcelWriter
la clase envuelve un XmlWriter
. No me he molestado, pero es posible que desee hacer un poco más de verificación de errores para asegurarse de que no puede escribir datos de celda antes de comenzar una fila, y demás. El código está a continuación.
public class ExcelWriter : IDisposable
private XmlWriter _writer;
public enum CellStyle General, Number, Currency, DateTime, ShortDate ;
public void WriteStartDocument()
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
_writer.WriteProcessingInstruction("mso-application", "progid="Excel.Sheet"");
_writer.WriteStartElement("ss", "Workbook", "urn:schemas-microsoft-com:office:spreadsheet");
WriteExcelStyles();
public void WriteEndDocument()
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
_writer.WriteEndElement();
private void WriteExcelStyleElement(CellStyle style)
_writer.WriteStartElement("Style", "urn:schemas-microsoft-com:office:spreadsheet");
_writer.WriteAttributeString("ID", "urn:schemas-microsoft-com:office:spreadsheet", style.ToString());
_writer.WriteEndElement();
private void WriteExcelStyleElement(CellStyle style, string NumberFormat)
_writer.WriteStartElement("Style", "urn:schemas-microsoft-com:office:spreadsheet");
_writer.WriteAttributeString("ID", "urn:schemas-microsoft-com:office:spreadsheet", style.ToString());
_writer.WriteStartElement("NumberFormat", "urn:schemas-microsoft-com:office:spreadsheet");
_writer.WriteAttributeString("Format", "urn:schemas-microsoft-com:office:spreadsheet", NumberFormat);
_writer.WriteEndElement();
_writer.WriteEndElement();
private void WriteExcelStyles()
_writer.WriteStartElement("Styles", "urn:schemas-microsoft-com:office:spreadsheet");
WriteExcelStyleElement(CellStyle.General);
WriteExcelStyleElement(CellStyle.Number, "General Number");
WriteExcelStyleElement(CellStyle.DateTime, "General Date");
WriteExcelStyleElement(CellStyle.Currency, "Currency");
WriteExcelStyleElement(CellStyle.ShortDate, "Short Date");
_writer.WriteEndElement();
public void WriteStartWorksheet(string name)
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
_writer.WriteStartElement("Worksheet", "urn:schemas-microsoft-com:office:spreadsheet");
_writer.WriteAttributeString("Name", "urn:schemas-microsoft-com:office:spreadsheet", name);
_writer.WriteStartElement("Table", "urn:schemas-microsoft-com:office:spreadsheet");
public void WriteEndWorksheet()
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
_writer.WriteEndElement();
_writer.WriteEndElement();
public ExcelWriter(string outputFileName)
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
_writer = XmlWriter.Create(outputFileName, settings);
public void Close()
if (_writer == null) throw new InvalidOperationException("Already closed.");
_writer.Close();
_writer = null;
public void WriteExcelColumnDefinition(int columnWidth)
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
_writer.WriteStartElement("Column", "urn:schemas-microsoft-com:office:spreadsheet");
_writer.WriteStartAttribute("Width", "urn:schemas-microsoft-com:office:spreadsheet");
_writer.WriteValue(columnWidth);
_writer.WriteEndAttribute();
_writer.WriteEndElement();
public void WriteExcelUnstyledCell(string value)
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
_writer.WriteStartElement("Cell", "urn:schemas-microsoft-com:office:spreadsheet");
_writer.WriteStartElement("Data", "urn:schemas-microsoft-com:office:spreadsheet");
_writer.WriteAttributeString("Type", "urn:schemas-microsoft-com:office:spreadsheet", "String");
_writer.WriteValue(value);
_writer.WriteEndElement();
_writer.WriteEndElement();
public void WriteStartRow()
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
_writer.WriteStartElement("Row", "urn:schemas-microsoft-com:office:spreadsheet");
public void WriteEndRow()
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
_writer.WriteEndElement();
public void WriteExcelStyledCell(object value, CellStyle style)
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
_writer.WriteStartElement("Cell", "urn:schemas-microsoft-com:office:spreadsheet");
_writer.WriteAttributeString("StyleID", "urn:schemas-microsoft-com:office:spreadsheet", style.ToString());
_writer.WriteStartElement("Data", "urn:schemas-microsoft-com:office:spreadsheet");
switch (style)
case CellStyle.General:
_writer.WriteAttributeString("Type", "urn:schemas-microsoft-com:office:spreadsheet", "String");
break;
case CellStyle.Number:
case CellStyle.Currency:
_writer.WriteAttributeString("Type", "urn:schemas-microsoft-com:office:spreadsheet", "Number");
break;
case CellStyle.ShortDate:
case CellStyle.DateTime:
_writer.WriteAttributeString("Type", "urn:schemas-microsoft-com:office:spreadsheet", "DateTime");
break;
_writer.WriteValue(value);
// tag += String.Format("1">0:yyyy\-MM\-dd\THH\:mm\:ss\.fff ", value,
_writer.WriteEndElement();
_writer.WriteEndElement();
public void WriteExcelAutoStyledCell(object value)
if (_writer == null) throw new InvalidOperationException("Cannot write after closing.");
//write the and tags for something
if (value is Int16
#region IDisposable Members
public void Dispose()
if (_writer == null)
return;
_writer.Close();
_writer = null;
#endregion
Entonces puede exportar su DataTable
usando lo siguiente:
public static void ExcelExport(DataTable data, String fileName, bool openAfter)
//export a DataTable to Excel
DialogResult retry = DialogResult.Retry;
while (retry == DialogResult.Retry)
try
using (ExcelWriter writer = new ExcelWriter(fileName))
writer.WriteStartDocument();
// Write the worksheet contents
writer.WriteStartWorksheet("Sheet1");
//Write header row
writer.WriteStartRow();
foreach (DataColumn col in data.Columns)
writer.WriteExcelUnstyledCell(col.Caption);
writer.WriteEndRow();
//write data
foreach (DataRow row in data.Rows)
writer.WriteStartRow();
foreach (object o in row.ItemArray)
writer.WriteExcelAutoStyledCell(o);
writer.WriteEndRow();
// Close up the document
writer.WriteEndWorksheet();
writer.WriteEndDocument();
writer.Close();
if (openAfter)
OpenFile(fileName);
retry = DialogResult.Cancel;
catch (Exception myException)
retry = MessageBox.Show(myException.Message, "Excel Export", MessageBoxButtons.RetryCancel, MessageBoxIcon.Asterisk);
El siguiente sitio muestra cómo exportar un DataSet (o DataTable o List <>) en un “auténtico“Archivo de Excel 2007 .xlsx.
Utiliza el OpenXML bibliotecas, por lo que no necesita tener Excel instalado en su servidor.
Biblioteca C # ExportToExcel
Se proporciona todo el código fuente, gratis, junto con las instrucciones para usarlo con ASP.NET, ASP.NET Core 2+ o C # normal.
Es muy fácil de agregar a sus propias aplicaciones, solo necesita llamar a una función, pasar un nombre de archivo de Excel y su fuente de datos:
DataSet ds = CreateSampleData();
string excelFilename = "C:\Sample.xlsx";
CreateExcelFile.CreateExcelDocument(ds, excelFilename);
Espero que esto ayude.
Si te gustó nuestro trabajo, tienes la libertad de dejar un ensayo acerca de qué le añadirías a este artículo.