none
Exportar GridView a Excel RRS feed

  • Pregunta

  • Buen dia foro!

    De antemano muchas gracias por cualquier aporte que me puedan brindar.

    Tengo un pequeño problema exportando un GridView a Excel desde C#:

    El exporte funciona correctamente pero el problema surge cuando defino campos en VS como string y al momento de exportar se pierden sus valores. Ejm:

    string a= "0001"; si se exporta este campo a Excel aparecerá como a=1.

    Agradezco cualquier ayuda que puedan brindarme.

    • Cambiado Karen Malagón martes, 7 de abril de 2015 20:57 Programming with Excel
    miércoles, 1 de abril de 2015 15:07

Respuestas

  • Hola a todos!

    Después de tanto buscar, por fin pude dar con la solución, y es relativamente sencilla. En primer lugar es necesario tener la libreria ClosedXML (using ClosedXML.Excel;) en el CodeBehind. Una vez hecho esto, el código es similar al que sigue:

    protected void ExportarExcel(object sender, EventArgs e)
    
    {
    
    Datatable dt = new DataTable();
    
    dt = CapaLogica.MetodoQueLlenaDataTable(parametro); //Para los que programamos entre Capas
    
    using (XLWorkBook wb = new XLWorkBook())
    
    wb.AddWorksheet(dt, "NombredelExcel");
    
    Response.Clear();
    Response.Buffer = true;
    Response.Charset = "";
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheet.sheet";
    Response.AddHeader("content-disposition", "attachment; filename = NombredelExcel " + DateTime.Now + ".xlsx");
                    using (MemoryStream mymemory = new MemoryStream())
                    {
                        wb.SaveAs(mymemory);
                        mymemory.WriteTo(Response.OutputStream);
                        Response.Flush();
                        Response.End();
                    }
                }
    
    
    }


    • Marcado como respuesta jhonnavel lunes, 20 de abril de 2015 22:17
    lunes, 20 de abril de 2015 21:57

Todas las respuestas

  • si el HTML generado muestra 0001, pues ni modo, no creo que esté en su poder decirle a Excel que no lo interprete como número.

    En otras palabras, lo que yo creo es que eso no tiene una solución usando el GridView para exportar.  Tendría que usar algo como OpenXML donde puede usted tener más control sobre el archivo de Excel que se genera para poder resolver su problema.


    Jose R. MCP
    Code Samples

    miércoles, 1 de abril de 2015 15:13
  • Buen día Jose. Gracias por tu respuesta.

    El código funciona similar a esto:

    Un formulario web (similar al de registrarse en una página cualquiera), algunos DropDownList usan códigos por debajo (entre esos están algunos que tienen ceros adelante definidos como string) como algunos campos se "queman" con valores también definidos como string... todos los campos se almacenan en una base de Datos (quedan correctamente registrados respetando los ceros por definición del campo en la misma base de datos), el botón al ser pulsado recoge algunos campos de la base de datos, los pinta en un GridView y se exporta a Excel; cuando es exportado se presenta el inconveniente únicamente con dichos campos

    miércoles, 1 de abril de 2015 15:26
  • Claro, le comprendo muy bien.  El problema está en que la conversión se da en un lugar al que usted no tiene acceso:  El código que está en Excel que interpreta el HTML y lo traduce a datos en una hoja de cálculo.  Esa parte del código no la controla usted y hasta donde sé, no es posible pasar metadata de algún tipo para informarle a Excel que cierta celda de la tabla HTML debe ser "string" aún cuando a Excel le parezca numérico.

    Por eso le dije en mi respuesta original que para corregir este problema usted debe abandonar totalemnte esta ruta de exportación y utilizar algo más complejo, como por ejemplo OpenXML, para generar el archivo en el servidor web y luego proveerlo como una descarga.


    Jose R. MCP
    Code Samples


    • Editado webJose miércoles, 1 de abril de 2015 15:34
    • Propuesto como respuesta Karen Malagón miércoles, 1 de abril de 2015 18:25
    miércoles, 1 de abril de 2015 15:33
  • string a = "'0001";

    En una celda con formato general, un "número" ingresado anteponiendo el apóstrofe será tratado como texto.

    • Propuesto como respuesta Karen Malagón miércoles, 1 de abril de 2015 18:25
    miércoles, 1 de abril de 2015 17:33
  • Hola Karen

    Lo que pasa es que el GridView se compone por una serie de campos de una Base de Datos definidos como NVARCHAR, que se encuentran con ese formato (a=0001). El problema es al Exportar el GridView a Excel que a pesar de ser definido como string elimina los ceros a la izquierda.

    Es posible tener un GridView generado y a partir de allí concatenarle el caracter (') a cada celda? y generar otro con este "nuevo formato"? Lo he intentado pero al momento ha sido en vano.

    Muchas gracias nuevamente!

    miércoles, 1 de abril de 2015 19:44
  • Hola a todos!

    Después de tanto buscar, por fin pude dar con la solución, y es relativamente sencilla. En primer lugar es necesario tener la libreria ClosedXML (using ClosedXML.Excel;) en el CodeBehind. Una vez hecho esto, el código es similar al que sigue:

    protected void ExportarExcel(object sender, EventArgs e)
    
    {
    
    Datatable dt = new DataTable();
    
    dt = CapaLogica.MetodoQueLlenaDataTable(parametro); //Para los que programamos entre Capas
    
    using (XLWorkBook wb = new XLWorkBook())
    
    wb.AddWorksheet(dt, "NombredelExcel");
    
    Response.Clear();
    Response.Buffer = true;
    Response.Charset = "";
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheet.sheet";
    Response.AddHeader("content-disposition", "attachment; filename = NombredelExcel " + DateTime.Now + ".xlsx");
                    using (MemoryStream mymemory = new MemoryStream())
                    {
                        wb.SaveAs(mymemory);
                        mymemory.WriteTo(Response.OutputStream);
                        Response.Flush();
                        Response.End();
                    }
                }
    
    
    }


    • Marcado como respuesta jhonnavel lunes, 20 de abril de 2015 22:17
    lunes, 20 de abril de 2015 21:57