none
Exportar de SSRS directamente a Excel sin guardar en disco RRS feed

  • Pregunta

  • Hola a todos, necesito nuevamente de sus conocimientos, resulta que desarrollamos una aplicación de escritorio en VS2015 y generamos los reportes con SQL Server Report Server, la versión de SQL Server es 2008 R2, pues bien al dar clic en el boton de exportar secciono Excel pero me pide guardar en disco, mi pregunta es si hay alguna forma de que se pueda exportar directamente a la aplicación de Excel sin necesidad de guardar en disco. En la versión anterior del sistema lo teníamos desarrollado en VS2013 y los reportes eran de Crystal Report pero hasta donde he leído en la versión de VS2015 no es compatible el Crystal Report y todos los comentarios indican que no son compatibles por eso optamos en la migración a VS2015 generar los reportes con SSRS.

    Espero que me puedan ayudar con esto porque ya tenemos que liberar el nuevo sistema pero debemos resolver lo de la exportación directa a la aplicación.

    Saludos

    miércoles, 29 de noviembre de 2017 2:28

Respuestas

  • Puedes añadir una Referencia al .asmx de SSRS e invocar el método Render para que te devuelva el informe en el formato que quieras, Excel incluido. En la doc de MS tienes un ejemplo:

    https://msdn.microsoft.com/en-us/library/ms252214%28v=vs.90%29.aspx

    Verás que lo que te devuelve el .Reder es un array de bytes con el contenido de reporte en formato Excel. El ejemplo de la documentación lo que hace a continuación es salvar ese array a un fichero en disco, pero nada te obliga a hacerlo así; por ejemplo, en aplicaciones web es muy típico devolver esos bytes en el Response.Write para devolverle el Excel al usuario sin pasar por disco en el servidor.

    Ahora bien, si lo que quieres es pasárselo a la aplicación Excel, tendrás que salvarlo en disco y decirle al Excel que abra el fichero en disco. Esto no es culpa de SSRS, sino de Excel, que no sabe tomar los datos desde otro sitio que no sea un archivo. La alternativa sería usar automatización OLE para inyectar los datos directamente sobre Excel, pero en este caso no usarías un Report sino que leerías directamente los datos desde la base de datos y los inyectarías en Excel mediante un bucle de código.

    • Propuesto como respuesta Pablo RubioModerator miércoles, 29 de noviembre de 2017 15:46
    • Marcado como respuesta Paco Miranda miércoles, 29 de noviembre de 2017 23:59
    miércoles, 29 de noviembre de 2017 8:04
  • Gracias por tus observaciones Alberto, es cierto lo que me comentas pero creo que no me explique correctamente, efectivamente siempre se guarda en disco pero el usuario lo que no quiere es que le abra la ventada de guardar ya que tiene que poner la ubicación y nombre del archivo, luego tiene que buscar el archivo y abrirlo, por eso programamos en el sistema que cuando le de exportar internamente guardamos y abrimos el archivo para que el usuario no lo tenga que hacer, y llamándolo en web como bien dices el Internet Explorer es quién lo realiza y solo le pregunta al usuario si quiere abrirlo o guardarlo y aunque solo elija abrirlo, internamente lo guarda en disco y luego lo abre pero el usuario no se da cuenta de eso. En cuanto a la eliminación de esos archivos los eliminas mediate las herramientas del S.O. y los que generamos en la aplicación los tenemos que eliminar mediante una rutina que generamos.

    Nuevamente te agradezco tus atenciones y consejos. Saludos

    jueves, 30 de noviembre de 2017 20:06

Todas las respuestas

  • Puedes añadir una Referencia al .asmx de SSRS e invocar el método Render para que te devuelva el informe en el formato que quieras, Excel incluido. En la doc de MS tienes un ejemplo:

    https://msdn.microsoft.com/en-us/library/ms252214%28v=vs.90%29.aspx

    Verás que lo que te devuelve el .Reder es un array de bytes con el contenido de reporte en formato Excel. El ejemplo de la documentación lo que hace a continuación es salvar ese array a un fichero en disco, pero nada te obliga a hacerlo así; por ejemplo, en aplicaciones web es muy típico devolver esos bytes en el Response.Write para devolverle el Excel al usuario sin pasar por disco en el servidor.

    Ahora bien, si lo que quieres es pasárselo a la aplicación Excel, tendrás que salvarlo en disco y decirle al Excel que abra el fichero en disco. Esto no es culpa de SSRS, sino de Excel, que no sabe tomar los datos desde otro sitio que no sea un archivo. La alternativa sería usar automatización OLE para inyectar los datos directamente sobre Excel, pero en este caso no usarías un Report sino que leerías directamente los datos desde la base de datos y los inyectarías en Excel mediante un bucle de código.

    • Propuesto como respuesta Pablo RubioModerator miércoles, 29 de noviembre de 2017 15:46
    • Marcado como respuesta Paco Miranda miércoles, 29 de noviembre de 2017 23:59
    miércoles, 29 de noviembre de 2017 8:04
  • Estimado Alberto,

    Muchas gracias por tomarte el tiempo de darme una respuesta, pues como me indicas, para probar puse Crystal Report en VS2015 y cargo un reporte, al darle vista previa me muestra los datos pero si le doy en exportar a Excel tampoco me permite enviarlo directamente a la aplicación, finalmente lo que hicimos fue programar el evento exportar del Report Viewer para que la misma aplicación lo grabe en disco y después lo abra mediante Excel, lo malo es que el usuario final siempre cierra el sistema y se queda trabajando con Excel y si quisiera volver a emitir el reporte y exportarlo sin cerrar el anterior o bien, me generar error o debo guardar otro archivo en disco y esto va dejando muchos archivos basura, por lo que tuvimos que programas una tarea para que elimine los archivos que generamos desde la aplicación cada que se ingresa a la aplicación. También intentamos llamar los resportes SSRS desde web y ahí si lo exporta directamente a Excel sin que el usuario tenga que guardarlo en disco pero no me aparece el botón de imprimir y no encuentro como hacer para que aparezca

    Voy a seguir buscando soluciones y ver si mejor los volvemos a desarrolla con Crystal Report que tiene más funcionalidades y si encontramos una buena solución ya la estaré compartiendo

    Saludos

    miércoles, 29 de noviembre de 2017 23:59
  • También intentamos llamar los resportes SSRS desde web y ahí si lo exporta directamente a Excel sin que el usuario tenga que guardarlo en disco

    Ojo, no es cierto que haciéndolo así no haya que pasar por disco. Lo que ocurre es que el navegador lo salva en un archivo temporal y luego le dice a Excel que abra ese archivo. Y sucede lo mismo que cuando el archivo temporal lo guardas tú mismo en tu aplicación: si lo cierran de cualquier manera, la carpeta donde el navegador va salvando esos archivos se va quedando llena de archivos temporales. Así que con esto no resuelves nada.

    En cuanto al botón de "imprimir": Si lo estás haciendo con un ReportViewer de WebForms o navegando directamente al servidor de SSRS, la impresión la hace mediante un control ActiveX, que solo funciona en Internet Explorer. Así que si estás usando otro navegador distinto, por eso no te sale el botón de imprimir.

    jueves, 30 de noviembre de 2017 12:55
  • Gracias por tus observaciones Alberto, es cierto lo que me comentas pero creo que no me explique correctamente, efectivamente siempre se guarda en disco pero el usuario lo que no quiere es que le abra la ventada de guardar ya que tiene que poner la ubicación y nombre del archivo, luego tiene que buscar el archivo y abrirlo, por eso programamos en el sistema que cuando le de exportar internamente guardamos y abrimos el archivo para que el usuario no lo tenga que hacer, y llamándolo en web como bien dices el Internet Explorer es quién lo realiza y solo le pregunta al usuario si quiere abrirlo o guardarlo y aunque solo elija abrirlo, internamente lo guarda en disco y luego lo abre pero el usuario no se da cuenta de eso. En cuanto a la eliminación de esos archivos los eliminas mediate las herramientas del S.O. y los que generamos en la aplicación los tenemos que eliminar mediante una rutina que generamos.

    Nuevamente te agradezco tus atenciones y consejos. Saludos

    jueves, 30 de noviembre de 2017 20:06