Foros del Web » Programando para Internet » ASPX (.net) »

exportar a excel

Estas en el tema de exportar a excel en el foro de ASPX (.net) en Foros del Web. Hola, mi pregunta tiene que ver con exportar a excel. Conozco y he usado 3 metodos para esto desde VB .Net 1) Concatenar codigo html ...
  #1 (permalink)  
Antiguo 11/02/2009, 09:29
Avatar de claudiovega  
Fecha de Ingreso: octubre-2003
Ubicación: Puerto Montt
Mensajes: 3.667
Antigüedad: 20 años, 6 meses
Puntos: 11
exportar a excel

Hola, mi pregunta tiene que ver con exportar a excel. Conozco y he usado 3 metodos para esto desde VB .Net

1) Concatenar codigo html en una variable string, escribir su contenido en un objeto htmlwriter con extension xls y dejarlo para descarga. Inconveniente, no es posible darle todo el formato que se requiere ni crear archivo con multiples hojas.

2) Renderizar un gridview. Es igual al anterior pero mas simple y tiene los mismo inconvenientes

3) Usar las clases que provee el namespace Microsoft.Office. Con esto puedes crear archivos xls tal como si lo hicieras usando el excel, lo creas, lo guardas en el servidor, y redireccionas para descargarlo. El problema que me ha dado es con permisos, con algunos usuarios, y no he podido encontrar el por que, me refiero a que a la mayoria de usuarios le funciona y algunos se les cae.

MI pregunta es: ¿Existe en esta tercera opcion algún metodo que me permita tomar todo el contenido del archivo excel que está en memoria y "tirarlo" para descarga usando los headers adecuados? Es decir, leer todo el contenido binario del archivo en memoria y darlo para descarga .
  #2 (permalink)  
Antiguo 11/02/2009, 14:34
Avatar de Fann_Lavigne  
Fecha de Ingreso: diciembre-2004
Mensajes: 622
Antigüedad: 19 años, 4 meses
Puntos: 12
Respuesta: exportar a excel

Aqui te pongo el codigo de una Clase, con la cual exporto yo unos Grids, y le puedes dar el formato que tu quieras.

Código:
Imports System
Imports System.Data
Imports System.Configuration
Imports System.IO
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls

Public Class GridViewExportUtil

    Public Shared Function Export(ByVal gv As GridView) As String
        HttpContext.Current.Response.Clear()

        Dim sw As StringWriter = New StringWriter
        Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
        '  Create a form to contain the grid
        Dim table As Table = New Table
        With table
            .GridLines = gv.GridLines
            .Width = gv.Width.Value
        End With


        'AGREGANDO EL HEADER.
        If Not (gv.HeaderRow Is Nothing) Then
            GridViewExportUtil.PrepareControl*****port(gv.HeaderRow)
            With gv.HeaderRow
                .Cells(gv.Columns.Count - 1).Visible = False 'kitando la ultima KOLUMNA DEL HEADER
                .HorizontalAlign = HorizontalAlign.Center
                .BackColor = Drawing.ColorTranslator.FromHtml("#4A3C8C")
                .ForeColor = Drawing.Color.White
            End With

            table.Rows.Add(gv.HeaderRow)
        End If



        '  add each of the data rows to the table
        For Each row As GridViewRow In gv.Rows
            GridViewExportUtil.PrepareControl*****port(row)

            With row
                .BackColor = Drawing.ColorTranslator.FromHtml("#E7E7FF")
                .ForeColor = Drawing.ColorTranslator.FromHtml("#4A3C8C")
                .Cells(gv.Columns.Count - 1).Visible = False
                '.BorderWidth = 1
                .HorizontalAlign = HorizontalAlign.Center
                '.Font.Bold = True
                '<AlternatingRowStyle BackColor="#F7F7F7" />
                '<RowStyle BackColor="#E7E7FF" ForeColor="#4A3C8C" />
            End With

            table.Rows.Add(row)
        Next

        'AGREGANDO EL footer.
        If Not (gv.FooterRow Is Nothing) Then
            GridViewExportUtil.PrepareControl*****port(gv.FooterRow)
            With gv.FooterRow
                .Cells(gv.Columns.Count - 1).Visible = False 'kitando la ultima KOLUMNA DEL HEADER
                .HorizontalAlign = HorizontalAlign.Center
                .BackColor = Drawing.ColorTranslator.FromHtml("#B5C7DE")
                .ForeColor = Drawing.ColorTranslator.FromHtml("#4A3C8C")
                .Font.Bold = True

            End With

            table.Rows.Add(gv.FooterRow)
        End If

        '  render the table into the htmlwriter
        table.BorderWidth = 2
        table.RenderControl(htw)
        Export = sw.ToString
    End Function

    ' Replace any of the contained controls with literals
    Private Shared Sub PrepareControl*****port(ByVal control As Control)
        Dim i As Integer = 0
        Do While (i < control.Controls.Count)
            Dim current As Control = control.Controls(i)

            If (TypeOf current Is LinkButton) Then
                control.Controls.Remove(current)
            ElseIf (TypeOf current Is ImageButton) Then
                control.Controls.Remove(current)
            ElseIf (TypeOf current Is HyperLink) Then
                control.Controls.Remove(current)
            ElseIf (TypeOf current Is DropDownList) Then
                control.Controls.Remove(current)
            ElseIf (TypeOf current Is CheckBox) Then
                control.Controls.Remove(current)
            ElseIf (TypeOf current Is RadioButton) Then
                control.Controls.Remove(current)
            ElseIf (TypeOf current Is TextBox) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, TextBox).Text))
            ElseIf (TypeOf current Is RegularExpressionValidator) Then
                control.Controls.Remove(current)
            ElseIf (TypeOf current Is Button) Then
                control.Controls.Remove(current)
            End If

            If current.HasControls Then
                GridViewExportUtil.PrepareControl*****port(current)
            End If

            i = (i + 1)
        Loop
    End Sub
End Class
Para usar usas la funcion Export y le pasas el grid que deseas exportar, en esta misma le puedes dar diferentes formatos a tus celdas columnas, etc.

El sub PrepareControl*****port remueve todos los controles que tengas en tus TemplateColumns y los pasa a literales, es decir a puro texto.

Espero te sirva, saludos.

No se porque pone *** (astericos) en el nombre del Sub cuando publico mi respuesta, pero los astericos son F o r E x (sin los espacios)
__________________
"Entre Mas Brillante Es Una Mente, Tiene Que Luchar Contra Demonios Internos Mas Poderosos"
[email protected]

Última edición por Fann_Lavigne; 11/02/2009 a las 14:36 Razón: Pone *
  #3 (permalink)  
Antiguo 25/02/2009, 08:32
Avatar de sabandija25  
Fecha de Ingreso: abril-2004
Mensajes: 302
Antigüedad: 20 años
Puntos: 0
Respuesta: exportar a excel

Holas,

Estaba intentando incorporar tu clase para ocuparla pero me encontré con el siguiente problema:

La función export la llamo desde un imagebutton creado a partir de código, para lo cual al momento de declarar el botón lo hice así:

Código HTML:
Dim WithEvents toexcel As New ImageButton
La función que gatilla tu proceso es la siguiente
Código HTML:
   Protected Sub toexcel_Click(ByVal sender As Object, ByVal e As System.Web.UI.ImageClickEventArgs) Handles toexcel.Click
        If sender.id = "ExportToExcel1" Then
                GridViewExportUtil.Export(GridView1)
        End If
    End Sub
Coloco el if de ID, porque tengo 3 gridview en total (en distintas vistas)... el problema es que cuando hago click en el botón me hace un postback y todo queda igual, puse un alert en la función toexcel_Click, pero no pasa por ahí... que puedo estar haciendo mal?

saludos!
__________________
¡¡¡¡¡¡GRANDE COLO COLO CAMPEÓN!!!!!
- 25 TÍTULOS NACIONALES, 1 COPA LIBERTADORES, 1 COPA INTERAMERICANA...
Y TU CHUNCHO CUANDO?
  #4 (permalink)  
Antiguo 25/02/2009, 10:05
Avatar de Fann_Lavigne  
Fecha de Ingreso: diciembre-2004
Mensajes: 622
Antigüedad: 19 años, 4 meses
Puntos: 12
Respuesta: exportar a excel

a que hace referencia "ExportToExecel1" es el ID de tu imageButton o es el ID de ke? es lo ke no me ha kedado muy klaro? o es tu GridView? En ese caso no kreo ke necesites el ID asi, solo manda llamar la funciona pasandole a la funcion el ID del grid.

Código:
GridViewExportUtil.Export(ExportToExcel1)
Espero te haya entendido bien, sino komentame y lo revisamos
__________________
"Entre Mas Brillante Es Una Mente, Tiene Que Luchar Contra Demonios Internos Mas Poderosos"
[email protected]
  #5 (permalink)  
Antiguo 25/02/2009, 10:56
Avatar de sabandija25  
Fecha de Ingreso: abril-2004
Mensajes: 302
Antigüedad: 20 años
Puntos: 0
Respuesta: exportar a excel

Buenas...

es el id del imagebutton

salu2!
__________________
¡¡¡¡¡¡GRANDE COLO COLO CAMPEÓN!!!!!
- 25 TÍTULOS NACIONALES, 1 COPA LIBERTADORES, 1 COPA INTERAMERICANA...
Y TU CHUNCHO CUANDO?
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:10.