Saltar al contenido

c # (WinForms-App) exportar DataSet a Excel

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *