none
GENERAR UN EXCEL DESDE CONSULTA SQL SERVER EN DE ASP.NET RRS feed

  • Pregunta

  • Muy buenas tardes estimados estoy empezando a programar en ASP.NET y tengo el siguiente problema

    tengo que hacer una consulta a la BD (sql 2000) y el resultado de esa consulta la tengo que ordenar y escribir un excel con los resultados de esa consulta 

    sera que se puede hacer 

    y me podrían ayudar 

    de antemano muchas gracias

    lunes, 28 de octubre de 2019 20:21

Todas las respuestas

  • Sí, se puede hacer, pero hacerlo bien no es nada sencillo.

    Hay soluciones intermedias relativamente fáciles. Por ejemplo, puedes hacer la consulta al servidor y concatenar los valores en un string en formato csv, y devolver ese csv. El Excel es capaz de abrir el csv como si fuera una hoja de cálculo. Pero no puedes meter formatos ni cálculos dentro de un csv.

    Otra solución comparativamente fácil consiste en generar los datos como HTML. Esto tiene la ventaja de que se puede hacer usando los automatismos ya existentes en ASP.NET como por ejemplo un databinding a un GridView. Después devuelves el HTML poniendo en las cabeceras HTTP que se trata de un fichero Excel. Los Excel antiguos se lo "tragan" perfectamente y lo muestran como si fuera una hoja de cálculo. Los Excel modernos presentan un aviso de advertencia, pero si le dices que continúe también presentan el contenido perfectamente en la hoja de cálculo. Este método tiene la ventaja de que te toma todos los formatos del html, como los colores de las celdas, los tipos de letra, etc.

    Otra opción es usar una herramienta de reportes, como el ReportViewer que viene con Visual Studio. Tiene la ventaja de que puedes configurar un reporte que tome los datos de SQL Server y los presente con el formato que quieras, usando el diseñador de reportes. Después le puedes decir al ReportViewer que lo exporte a Excel. Puedes previsualizarlo en pantalla si te viene bien, o si lo prefieres también puedes enviarle comandos por programación al ReportViewer para que lo exporte a Excel sin mostrarlo en pantalla. Esto también respeta los formatos del informe (colores, tamaños, etc.) al generar el archivo Excel.

    Finalmente, puedes generar el fichero .xlsx propiamente. Para esto necesitarás alguna librería, tal como el OpenXml de Microsoft (descarga gratuita) o alguna librería de terceras partes tal como ClosedXml. Hay varias librerías de este tipo para generar Excel de varias maneras, es cuestión de elegir la que más se adapte a tus necesidades y aprender a manejarla. Ventaja: puedes hacer "de todo" con el fichero Excel. Inconveniente: la curva de aprendizaje suele ser empinada, salvo que quieras un fichero "trivial" y simplemente copies y pegues algún ejemplo.

    Otra alternativa es usar el driver de Excel mediante OleDb usando el JET Engine para tratar el fichero Excel como una tabla. Tiene la ventaja de que puedes leer de Sql y grabar en Excel directamente "de tabla a tabla", con lo que es comparativamente sencillo de hacer. Pero no puedes aplicar formatos al fichero de destino. Además, solo hay versión de 32 bits.

    Lo que no te recomiendo en absoluto es que uses un Excel instalado en el servidor mediante COM/Interop. Esta opción solo es buena para aplicaciones de escritorio, pero se desaconseja para ASP.NET, aunque encuentres algunos ejemplos cuando haces búsquedas sobre el tema.

    • Propuesto como respuesta Pablo Rubio lunes, 28 de octubre de 2019 23:09
    lunes, 28 de octubre de 2019 22:03
  • enterado muchas gracias  por tu respuesta 

    te comento que estoy intentado generar un  ReportViewer pero al momento de filtrar la información me presenta el siguiente error .

    "ERROR [28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Error de inicio de sesión del usuario"

    lo que mi estoy viendo que sucede es de que toma el nombre de mi PC y no el usuario con el que estoy logeado

    y creo una nueva cadena de conexión  para el Data Set pero cuando lo ejecuto no se que pasa y vuelve a tomar la conexión anterior

    de antemano muchas gracias

     


    • Editado Desarrollador asp martes, 29 de octubre de 2019 13:58
    • Propuesto como respuesta Pablo Rubio miércoles, 30 de octubre de 2019 22:22
    martes, 29 de octubre de 2019 13:57
  • Hola buen dia

    Intentaste ordenar o filtrar los datos directamente en el procedimiento almacenado o la consulta?

    Asi ya tendrias todos los datos ordenados para pasarlos al excel

    Saludos
    martes, 29 de octubre de 2019 14:48
  • hola buenos dias gracias por tu respuesta

    fíjate que si estoy ordenando los datos 

    te comento que estoy intentando enlazar un ReportViewer pero me arroja el siguiente error

    ERROR [28000] [Microsoft][ODBC SQL Server Driver][SQL Server]Error de inicio de sesión del usuario 'DOMINIO\nombreequipo'.

    no se a que se debe este error la conexión del dataset esta por medio de los ODBC de mi maquina

    saludos,

    martes, 29 de octubre de 2019 16:28
  • Ese error indica que estas usando autenticacion integrada para la conexion. Es decir, le estas pidiendo al servidor web que pase las credenciales actuales al servidor de base de datos. En una aplicacion web, las "credenciales actuales" no son las del usuario que esta logado, sino las del Pool de aplicaciones de IIS. Tiene tres soluciones:

    1. Cambiar las credenciales del Pool para que sean las de una cuenta con permisos suficientes en el servidor SQL.
    2. Agregar la cuenta del equipo [dominio\NombreDeEquipo$] como login del servidor de base de datos.
    3. Cambiar la autenticacion a usuario y password en la cadena de conexion del programa, y hablitar esa credencial en el servidor de base de datos.

    Bueno, y hay otra que es impersonar al usuario para usar su login en el servidor de base de datos, pero esto no te lo aconsejo salvo casos muy especiales.

    Por cierto, ¿cómo es que estás alimentando de datos al ReportViewer con el proveedor de ODBC? ¿No deberías estar usando un proveedor más moderno? El SQL Server 2000 debería admitirte tanto OleDb como el SqlClient, es únicamente el SQL Server 6.0 (mucho más antiguo que el 2000) el que tiene restricciones en cuanto al proveedor, pero aún así no necesita el ODBC sino que aguanta OleDb. En cualquier caso, si usas ODBC con DSN ten cuidado de usar un DSN de sistema y no de usuario. En tiempo de ejecución el servidor web requiere el DSN de sistema, no funcionará con un DSN asignado al usuario actual.

    • Propuesto como respuesta Pablo Rubio miércoles, 30 de octubre de 2019 22:22
    martes, 29 de octubre de 2019 16:42