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

Problemas al exportar gridview a excel.

Estas en el tema de Problemas al exportar gridview a excel. en el foro de ASPX (.net) en Foros del Web. Saludos, estoy tratando de exportar el siguiente gridview a excel: <asp:GridView ID="gv1" runat="server" AutoGenerateColumns="false" AllowPaging="true" PageSize="10" ShowFooter="true" PagerSettings-Visible="false" SkinID="GridNormal"> <Columns> <asp:TemplateField HeaderText="Segmento"> <ItemTemplate><div align="left"> <a ...
  #1 (permalink)  
Antiguo 05/01/2009, 19:34
 
Fecha de Ingreso: junio-2007
Mensajes: 253
Antigüedad: 16 años, 10 meses
Puntos: 0
Problemas al exportar gridview a excel.

Saludos, estoy tratando de exportar el siguiente gridview a excel:

<asp:GridView ID="gv1" runat="server" AutoGenerateColumns="false" AllowPaging="true" PageSize="10" ShowFooter="true" PagerSettings-Visible="false" SkinID="GridNormal">
<Columns>
<asp:TemplateField HeaderText="Segmento">
<ItemTemplate><div align="left">
<a href="VtasSegSupervisores.aspx?period=<%# Server.HtmlDecode(Eval("periodo").ToString()) %>&segId=<%# Server.HtmlDecode(Eval("Segmento").ToString()) %>&FiltroEmp=<%#CType(wucFiltros.FindControl("ddlE mpresa"), DropDownList).SelectedValue%>">
<%#Server.HtmlDecode(Eval("Segmento").ToString() & "==>" & Eval("Clientes"))%>
</a></div>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="MontoTrim" HeaderText="Promedio" HtmlEncode="false" DataFormatString="{0:C2}" />
<asp:BoundField DataField="MontoPresu" HeaderText="Presupuesto" HtmlEncode="false" DataFormatString="{0:C2}" />
<asp:BoundField DataField="VtaNeta" HeaderText="Netas" HtmlEncode="false" DataFormatString="{0:C2}" />
<asp:BoundField DataField="MontoBruto" HeaderText="Brutas" HtmlEncode="false" DataFormatString="{0:C2}" />
<asp:BoundField DataField="ProyVtaNeta" HeaderText="Vta. Neta" HtmlEncode="false" DataFormatString="{0:C2}" />
<asp:TemplateField HeaderText="Venta(a la fecha)">
<ItemTemplate>
<asp:Label ID="lblPorcCump" runat="server" Text='<%# Format(CDec(Eval("PorCump")), "####0.00") & "%" %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Pres.">
<ItemTemplate>
<asp:Label ID="lblPorcProyPres" runat="server" Text='<%# Format(CDec(Eval("PorcProyPres")), "####0.00") & "%" %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Venta$">
<ItemTemplate>
<asp:Label ID="lblPorcUtil" runat="server" Text='<%# Format(CDec(Eval("PorcUtil")), "####0.00") & "%" %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="DevCInc" HeaderText="Con Inc." HtmlEncode="false" DataFormatString="{0:C2}" />
<asp:BoundField DataField="DevSInc" HeaderText="Sin Inc." HtmlEncode="false" DataFormatString="{0:C2}" />
<asp:TemplateField HeaderText="Part.">
<ItemTemplate>
<asp:Label ID="lblProcPart" runat="server" Text='<%# Format(CDec(Eval("PorcPartip")), "####0.00") & "%" %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="PorcDevol" HeaderText="Dev." HtmlEncode="false" DataFormatString="{0:####0.00%}" />
<asp:BoundField DataField="Utilidad" HeaderText="" Visible="false" />
</Columns>
</asp:GridView>

el gridview se exporta pero por ejemplo si la consulta trae 5 filas las primeras 4 filas se exportan correctamente y la ultima no salen ninguno de los valores que son templatefield, pero solo de la ultima fila, si solo trae una fila la consulta es lo mismo solo presenta las celdas que no son templatefield.

Si alguien tiene alguna idea de porque me pasa esto se lo agradeceria mucho.

Este es mi codigo de exportacion:

Public Shared Sub Export(ByVal fileName As String, ByVal gv As GridView)
HttpContext.Current.Response.Clear()
HttpContext.Current.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName))
HttpContext.Current.Response.ContentType = "application/ms-excel"
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
table.GridLines = gv.GridLines
' add the header row to the table
If (Not (gv.HeaderRow) Is Nothing) Then
ExportGridViewExcel.PrepareControl*****port(gv.Hea derRow)
table.Rows.Add(gv.HeaderRow)
End If
' add each of the data rows to the table
For Each row As GridViewRow In gv.Rows
ExportGridViewExcel.PrepareControl*****port(row)
table.Rows.Add(row)
Next
' add the footer row to the table
If (Not (gv.FooterRow) Is Nothing) Then
ExportGridViewExcel.PrepareControl*****port(gv.Foo terRow)
table.Rows.Add(gv.FooterRow)
End If
' render the table into the htmlwriter
table.RenderControl(htw)
' render the htmlwriter into the response
HttpContext.Current.Response.Write(sw.ToString)
HttpContext.Current.Response.End()
End Sub
  #2 (permalink)  
Antiguo 03/02/2009, 17:27
Avatar de Fann_Lavigne  
Fecha de Ingreso: diciembre-2004
Mensajes: 622
Antigüedad: 19 años, 4 meses
Puntos: 12
Respuesta: Problemas al exportar gridview a excel.

Te pongo el codigo de una clase que uso para exportar a excel grids, lo que pasa cuando son TemplateColumns es que hay que quitar el Template y asignarle un objeto Literal para que lo ponga como texto:

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
Te explico mas o menos como funciona, a la funcion Export es a la que le pasas el DG a exportar, el Sub PrepareControl*****port se encarga de quitar los Controles que tengas en cada celda y remplazarlo por su valor en texto. Espero te sirva. Saludos.
__________________
"Entre Mas Brillante Es Una Mente, Tiene Que Luchar Contra Demonios Internos Mas Poderosos"
[email protected]
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 17:20.