Blog de Jorge Pedraza

enero 19, 2010

Exportar DataTable a Excel desde ASP.NET

Filed under: Aplicaciones Web — JorgePedraza @ 11:04 pm
Tags: , , ,

Hola, este articulo quiere resaltar una opción sencilla y directa de exporta datos relacionado con un DataTable a una hoja de Excel desde ASP.NET.

Requisito para el Desarrollo:

  1. .NET Framework 2.0 o superior.
  2. Office 2007 SP 2 o superior.
  3. Visual Studio 2008 o superior.

Pasos para Generar la solución en Visual Studio:

  1. Definir un proyecto de Aplicación Web de ASP.NET.
  2. Dentro del proyecto definir dos carpeta: DownloadExcel, FileExcel.
  3. Se crea un archivo de Excel (Plantilla1.xlsx).
  4. En el archivo de Excel  Plantilla1.xlsx debe especificar el área donde van almacenar los datos. Esta área se define como Nombre a un Rango en Excel. 




  5. El archivo Plantilla1.xlsx se guarda dentro de la carpeta FileExcel del proyecto actual.
  6. Se establece el proceso de exportación a través del evento Click de un botón en determinada pagina ASPX.

Pasos de Generar el proceso de exportación:

  1. Se realiza una copia temporal de Plantilla1.xlsx de la carpeta DownloadExcel con el nombre FileExcel más el ID de la sesión ASP.NET junto con su extensión (.xlsx).
  2. Posteriormente se conecte y consulta la base de datos, con la cual cargara los datos en determinado DataTable.
  3. Ya lleno el DataTable de datos, se procede a manipular este en calidad de Inserción contra otro un origen de datos, en nuestro caso la Hoja de Excel.
  4. Una vez comprometido los datos con la Hoja de Excel, se transmite el archivo Excel como respuesta web al usuario de destino.
  5. Finalmente el archivo de Excel generado en el servidor y transmitido al cliente se elimina físicamente del servidor.

Descripción del Código de Exportación :

Partial Public Class _Default    ‘Clase de la Pagina Default.aspx
    Inherits System.Web.UI.Page

Private conOle As New OleDb.OleDbConnection ‘Objeto de Conexión contra la Hoja de Excel
    Private adaole As New OleDb.OleDbDataAdapter ‘Objeto Adaptador desde la Hoja de excel hacia el DataSet; en especifico un DataTable
    Private Function myconnectionstring(ByVal extension As String) As String  ‘Devuelve la cadena de conexión de la Hoja de Excel según la Extensión
        Dim retorno As String = ""
        Select Case extension
            Case ".xls"
                retorno = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=Yes;IMEX=0"""
            Case ".xlsx"
                retorno = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0 Xml"
        End Select
        Return retorno
    End Function

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click

Dim rutaOrigen As String = Server.MapPath("/fileexcel/Plantilla1.xlsx") ‘Obtiene la ruta absoluta del Archivo Plantilla1.xlsx.
        Dim rutaDestino As String = Server.MapPath("/DownloadExcel/") ‘Obtiene la ruta absoluta de la carpeta de DownloadExcel.
        Dim archivoDestino As String = "FileExcel" & Session.SessionID & ".xlsx" ‘Establece un Nombre Temporal del archivo de excel de destino.
        rutaDestino &= archivoDestino ‘Se completa la ruta del archivo de destino con el nombre creado.

IO.File.Copy(Server.MapPath("/fileexcel/Plantilla1.xlsx"), rutaDestino, True) ‘Se copia el archivo plantilla1.xlsx a la carpeta de Destino con el nombre previamente establecido.
        conOle.ConnectionString = String.Format(myconnectionstring(IO.Path.GetExtension(rutaDestino)), rutaDestino)
        adaole.InsertCommand = conOle.CreateCommand
        adaole.InsertCommand.CommandText = "Insert Into personal (nombre,apellido,Cedula) values (@nombre,@apellido,@cedula)"
        adaole.InsertCommand.CommandType = CommandType.Text

With adaole.InsertCommand.Parameters
            .Add("@nombre", OleDb.OleDbType.VarChar, 50, "nombre")
            .Add("@apellido", OleDb.OleDbType.VarChar, 50, "apellido")
            .Add("@Cedula", OleDb.OleDbType.VarChar, 50, "cedula")
        End With

Try
            conOle.Open() ‘Abre la conexión con el nuevo archivo de Excel copiado.
            adaole.Update(SetPersonal) ‘Se Actualiza los Datos que son almacenado en el DataTable, que son devueltos por SetPersonal
        Catch ex As Exception
            Label1.Text = ex.Message.ToString
        Finally
            conOle.Close() ‘Cierra la conexión con el nuevo archivo de Excel procesado.
            Response.ClearContent() ‘Borra toda la salida de contenido de la secuencia del búfer.
            Response.ClearHeaders() ‘Borra todos los encabezados de la secuencia del búfer.
            ‘Response.ContentType = "application/vnd.ms-excel" ‘Excel 2003
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" ‘Excel 2007
            Response.WriteFile(rutaDestino) ‘Escribe el archivo especificado directamente en la secuencia de salida de una respuesta HTTP.
            Response.Flush() ‘Envía al cliente toda la salida almacenada en el búfer
            Response.Close() ‘Cierra la conexión del socket con un cliente

            IO.File.Delete(rutaDestino) ‘Borra físicamente el Archivo de Excel Generado.

        End Try

End Sub

Function SetPersonal() As DataTable ‘ Devuelve un DataTable Temporal con Datos de prueba.
        Dim temp As New Data.DataTable
        temp.Columns.Add("nombre", GetType(String))
        temp.Columns.Add("apellido", GetType(String))
        temp.Columns.Add("cedula", GetType(String))

        For i As Integer = 0 To 10
            Dim nuevo As DataRow = temp.NewRow
            nuevo(0) = i.ToString
            nuevo(1) = i.ToString
            nuevo(2) = i.ToString
            temp.Rows.Add(nuevo)
        Next
        Return temp
    End Function

End Class

Anexo Código Fuente TestExcelASP (Visual Basic 2008)

9 comentarios »

  1. Increible la publicacion, muy util y funcional… espero que sigan saliendo publicaciones asi de importantes y aplicables.. !! Los felicito !

    Comentario por Carlos Francisco Rojas — enero 20, 2010 @ 2:44 am | Responder

    • Gracias estimado amigo. Muy importante tu sugerencia para el futuro.

      Saludos.

      Comentario por jorgepedraza — enero 20, 2010 @ 10:49 am | Responder

  2. muy bueno pero queria consultar si tienen un ejemplo en coldfusion porfavor

    Comentario por nancy — febrero 15, 2010 @ 8:25 pm | Responder

    • Hola, Gracias por el comentario.

      La verdad no tengo ejemplo con coldfusion!!!

      Saludos.

      Comentario por jorgepedraza — febrero 22, 2010 @ 7:46 pm | Responder

  3. […] Exportar DataTable a Excel desde ASP.NET enero, 2010 4 comentários 5 […]

    Pingback por Los números de 2010 « Blog de Jorge Pedraza — enero 2, 2011 @ 7:32 am | Responder

  4. Muchas gracias por aportar su conocimiento,
    gracias………….

    Comentario por Telmo — marzo 30, 2011 @ 8:21 am | Responder

  5. Excelente post.. ya lo estoy adaptando a mi desarrollo.

    Comentario por Wilder J. Romero Ciccone — febrero 20, 2013 @ 11:55 am | Responder


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: