none
COMO BLOQUEAR CELDAS DE UN EXCEL EXPORTADAS POR GRIDVIEW (CONVERTIR SOLO LECTURA) ASP.NET RRS feed

  • Pregunta

  • Buenas, Tengo un problema y es que al momento de Exportar mi gridView a excell aparecen los campos Editables y no quiero que se puedan editar dichos campos (columnas) solo que sea de lectura (Estilo PDF)

    éste es el codigo que uso 

    <html>
    <head>
    </head>
    <body>
    
    <asp:GridView ID="GridView2"  CssClass="Grid filtrar  " Width="100%" runat="server" AutoGenerateColumns="False" DataKeyNames="IDEnvios" DataSourceID="SqlDataSourceEnvios" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="4" ForeColor="Black" GridLines="Horizontal" >
    
                            <Columns>
                                <asp:CommandField  HeaderText="" ShowSelectButton="False" />
                                 <asp:BoundField DataField="NGuia" HeaderText="N° Guia" SortExpression="NGuia" />
                                <asp:BoundField DataField="Documento" HeaderText="Doc" SortExpression="Documento" />
                                <asp:BoundField DataField="CIRIf" HeaderText="Codigo -CI-RIF" SortExpression="CIRIf" />
                            
                                <asp:BoundField DataField="Destinatario" HeaderText="Destinatario" SortExpression="Destinatario" />
    
    
                                  <asp:BoundField DataField="DireciconLlegada" HeaderText="DirecciónLlegada" SortExpression="DireciconLlegada" />
    
                                
                                
    
                                 <asp:BoundField DataField="Status" HeaderText="Estado" SortExpression="Status" />
                                 <asp:BoundField DataField="Motivo" HeaderText="Motivo" SortExpression="Motivo" />
                                 <asp:BoundField DataField="FechaRegistr" HeaderText="FechaRegistro" SortExpression="FechaRegistr" />
                                 <asp:BoundField DataField="NFactura" HeaderText="NFactura" SortExpression="NFactura" />
                                 <asp:BoundField DataField="Telefono" HeaderText="Teléfono" SortExpression="Telefono" />
                                 <asp:BoundField DataField="Enviadopor" HeaderText="Enviadopor" SortExpression="Enviadopor" />
                                <asp:BoundField DataField="ReferenciaDeEnvio" HeaderText="ReferenciaDeEnvio" SortExpression="ReferenciaDeEnvio" />
                                <asp:BoundField DataField="CorreoElectronico" HeaderText="CorreoElectrónico" SortExpression="CorreoElectrónico" />
                                
                         <asp:BoundField DataField="Tipo" HeaderText="Tipo" SortExpression="Tipo" />
    
                   
                      
                            </Columns>
                                                                <FooterStyle BackColor="#CCCC99" ForeColor="Black" />
                                                                <HeaderStyle BackColor="#333333" Font-Bold="True" ForeColor="White" />
                                                                <PagerStyle BackColor="White" ForeColor="Black" HorizontalAlign="Right" />
                                                                <SelectedRowStyle BackColor="#CC3333" Font-Bold="True" ForeColor="White" />
                                                                <SortedAscendingCellStyle BackColor="#F7F7F7" />
                                                                <SortedAscendingHeaderStyle BackColor="#4B4B4B" />
                                                                <SortedDescendingCellStyle BackColor="#E5E5E5" />
                                                                <SortedDescendingHeaderStyle BackColor="#242121" />
                        </asp:GridView>                              
    
     <center>  
    
                             <hr />     
    
            <asp:Button ID="Button6" CssClass="btn  btn-primary" runat="server" Text="Excel"   />
     </center> 
    													</div>
    											 
    												</div>
    											</div>
    										</div>
    
    </body>
    </html>

    miércoles, 10 de octubre de 2018 13:53

Respuestas

  • Si estás haciendo la chapucilla de exportar el HTML del GridView y pasárselo al Excel diciéndole que es un xls, confiando en que el Excel convierta internamente el HTML en una hoja de cálculo, entonces no tienes ningun control sobre cómo lo trata Excel, como por ejemplo el bloqueo de las celdas. Si necesitas ese tipo de control, entonces no te basta con el truquillo del HTML, sino que tendrás que hacer una auténtica exportación de verdad a Excel, usando cualquiera de los mecanismos clásicos para ello, como por ejemplo interoperabilidad COM contra un ejecutable de Excel o alguna librería tal como OpenXml.
    miércoles, 10 de octubre de 2018 16:14
  • Sí, es bastante complicado.

    Si lo haces mediante COM el código es relativamente simple, porque puedes capturar una macro a mano en Excel y luego usar el código de la macro como base para escribir a partir de él el "exportador" en asp.net. Pero el problema de esta solución es que requiere un Excel en el servidor y que por razones de seguridad y eficiencia (aparte del coste de licencia) no se recomienda usarlo en aplicaciones servidoras (solo en las de escritorio).

    Si lo haces mediante una librería tal como OpenXml, el problema es que la curva de aprendizaje es muy empinada. Una vez que lo aprendes no es para tanto, porque puedes partir de los ejemplos ya hechos que inyectan valores en las celdas de una hoja, y repetirlo en un bucle que recorra los mismos datos de tu grid. Y para saber cómo bloquear las celdas puedes hacer una cosa: tomar el Excel y salvar la misma hoja con bloqueos y sin bloqueos. Y luego, el SDK de OpenXml tiene un comparador que te compara ambas y te dice cuál es el código que hay que escribir para pasar de una a la otra.

    Como ves, todo es viable, pero en cualquiera de los casos se requiere superar la curva de aprendizaje y escribir bastante código, ninguna de las soluciones es tan simple como lo de pasarle el HTML al Excel.

    miércoles, 10 de octubre de 2018 18:52
  • y de casualidad sabrías el codigo en vez de exportarlo a EXCEL  mejor lo exporto a PDF? solo que no encuentro el codigo para hacerlo a pdf,

    este es el codigo del botón que me lo genera a excel

    Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Response.Clear()
            Response.Buffer = True
            Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf")
            Response.Charset = ""
            Response.ContentType = "application/vnd.ms-excel"
            Using sw As New StringWriter()
                Dim hw As New HtmlTextWriter(sw)
    
                'To Export all pages
                GridView2.AllowPaging = False
                GridView2.DataBind()
    
    
                GridView2.HeaderRow.BackColor = Color.White
                For Each cell As TableCell In GridView2.HeaderRow.Cells
                    cell.BackColor = GridView2.HeaderStyle.BackColor
                Next
                For Each row As GridViewRow In GridView2.Rows
                    row.BackColor = Color.White
                    For Each cell As TableCell In row.Cells
                        If row.RowIndex Mod 2 = 0 Then
                            cell.BackColor = GridView2.AlternatingRowStyle.BackColor
                        Else
                            cell.BackColor = GridView2.RowStyle.BackColor
                        End If
                        cell.CssClass = "textmode"
                    Next
                Next
    
                GridView2.RenderControl(hw)
                'style to format numbers to string
                Dim style As String = "<style> .textmode { } </style>"
                Response.Write(style)
                Response.Output.Write(sw.ToString())
                Response.Flush()
                Response.[End]()
            End Using
        End Sub

    miércoles, 10 de octubre de 2018 20:08

Todas las respuestas

  • Si estás haciendo la chapucilla de exportar el HTML del GridView y pasárselo al Excel diciéndole que es un xls, confiando en que el Excel convierta internamente el HTML en una hoja de cálculo, entonces no tienes ningun control sobre cómo lo trata Excel, como por ejemplo el bloqueo de las celdas. Si necesitas ese tipo de control, entonces no te basta con el truquillo del HTML, sino que tendrás que hacer una auténtica exportación de verdad a Excel, usando cualquiera de los mecanismos clásicos para ello, como por ejemplo interoperabilidad COM contra un ejecutable de Excel o alguna librería tal como OpenXml.
    miércoles, 10 de octubre de 2018 16:14
  • Muchas gracias por su respuesta, es muy complicado llegar a ello?
    miércoles, 10 de octubre de 2018 17:20
  • Sí, es bastante complicado.

    Si lo haces mediante COM el código es relativamente simple, porque puedes capturar una macro a mano en Excel y luego usar el código de la macro como base para escribir a partir de él el "exportador" en asp.net. Pero el problema de esta solución es que requiere un Excel en el servidor y que por razones de seguridad y eficiencia (aparte del coste de licencia) no se recomienda usarlo en aplicaciones servidoras (solo en las de escritorio).

    Si lo haces mediante una librería tal como OpenXml, el problema es que la curva de aprendizaje es muy empinada. Una vez que lo aprendes no es para tanto, porque puedes partir de los ejemplos ya hechos que inyectan valores en las celdas de una hoja, y repetirlo en un bucle que recorra los mismos datos de tu grid. Y para saber cómo bloquear las celdas puedes hacer una cosa: tomar el Excel y salvar la misma hoja con bloqueos y sin bloqueos. Y luego, el SDK de OpenXml tiene un comparador que te compara ambas y te dice cuál es el código que hay que escribir para pasar de una a la otra.

    Como ves, todo es viable, pero en cualquiera de los casos se requiere superar la curva de aprendizaje y escribir bastante código, ninguna de las soluciones es tan simple como lo de pasarle el HTML al Excel.

    miércoles, 10 de octubre de 2018 18:52
  • y de casualidad sabrías el codigo en vez de exportarlo a EXCEL  mejor lo exporto a PDF? solo que no encuentro el codigo para hacerlo a pdf,

    este es el codigo del botón que me lo genera a excel

    Protected Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            Response.Clear()
            Response.Buffer = True
            Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.pdf")
            Response.Charset = ""
            Response.ContentType = "application/vnd.ms-excel"
            Using sw As New StringWriter()
                Dim hw As New HtmlTextWriter(sw)
    
                'To Export all pages
                GridView2.AllowPaging = False
                GridView2.DataBind()
    
    
                GridView2.HeaderRow.BackColor = Color.White
                For Each cell As TableCell In GridView2.HeaderRow.Cells
                    cell.BackColor = GridView2.HeaderStyle.BackColor
                Next
                For Each row As GridViewRow In GridView2.Rows
                    row.BackColor = Color.White
                    For Each cell As TableCell In row.Cells
                        If row.RowIndex Mod 2 = 0 Then
                            cell.BackColor = GridView2.AlternatingRowStyle.BackColor
                        Else
                            cell.BackColor = GridView2.RowStyle.BackColor
                        End If
                        cell.CssClass = "textmode"
                    Next
                Next
    
                GridView2.RenderControl(hw)
                'style to format numbers to string
                Dim style As String = "<style> .textmode { } </style>"
                Response.Write(style)
                Response.Output.Write(sw.ToString())
                Response.Flush()
                Response.[End]()
            End Using
        End Sub

    miércoles, 10 de octubre de 2018 20:08
  • Porque si lo exporto a PDF al menos no se podrá editar (hablo de seleccionar columna y modificar rapido)

    entonces solucionaria el problema 

    miércoles, 10 de octubre de 2018 20:09