ASP.NET - Exportando o conteúdo de um GridView para o
Excel
Que tal exportar o conteúdo de um GridView em uma página ASP.NET para o Excel ?
Para acompanhar este artigo faça o download do Visual Web Developer (VWD) -> Visual Web Developer 2005 Express Edition .
Abra o VWD e no Menu File selecione New Web Site, selecionando o tipo da linguagem, e, informe a localização e o nome do arquivo conforme figura abaixo:
![]() |
Remova o arquivo default.aspx clicando sobre o mesmo e selecionado a opção Delete.
A seguir clique com o botão direito do mouse sobre o nome da solução e selecione a opção - Add New Item. Em seguida selecione a opção Web Form informando na caixa de texto Name o nome Default.aspx (o nome padrão), selecionando a linguagem e deixando desmarcadas as caixas de seleção , conforme abaixo:
![]() |
Agora arraste os controles abaixo indicados para o formulário definindo as propriedades conforme indicado:
O layout da página poderá ter a seguinte aparência:
![]() |
Crie uma nova conexão o assistente do SQLDataSource para efetuar a conexão com sua base de dados. Pode ser um banco de dados Access, SQL Server , Oracle , MySQL , FireBird ,etc.
No exemplo eu estou teimando em usar o MSDE
que tem a seguinte string de conexão na minha máquina:
Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;User ID=sa;password=;Data Source=MACORATI\VSDOTNET
Precisamos definir a rotina doExcel que é disparada quando o usuário clica no botão de comando - Exportar para o Excel
Abaixo o código da rotina doExcel:
Sub doExcel(ByVal Source As Object, ByVal E As EventArgs) 'se o grid tiver mais que 65536 linhas não podemos exportar If dgv.Rows.Count.ToString + 1 < 65536 Then dgv.AllowPaging = "False" dgv.DataBind() Dim tw As New StringWriter() Dim hw As New System.Web.UI.HtmlTextWriter(tw) Dim frm As HtmlForm = New HtmlForm() Response.ContentType = "application/vnd.ms-excel" Response.AddHeader("content-disposition", "attachment;filename=" & txtArquivo.Text & ".xls") Response.Charset = "" EnableViewState = False Controls.Add(frm) frm.Controls.Add(dgv) frm.RenderControl(hw) Response.Write(tw.ToString()) Response.End() dgv.AllowPaging = "True" dgv.DataBind() Else LblError.Text = " planilha possui muitas linhas, não é possível exportar para o EXcel" End If End Sub |
No código acima cabe destacar que estou criando um formulário html e adicionando-o à coleção de controles para em seguida preenchendo o form com o GridView.
Note também que estou desabilitando temporariamente a paginação (AllowPaging=False).
Ao definir as propriedades do objeto response:
Vou executar a página usando o servidor do VWD. O resultado é o exibido a seguir:
![]() |
Ao clicar no botão para exportar para o Excel será solicitada a confirmação para Salvar o arquivo com o nome indicado. No caso macoratti.xls.
![]() |
Após Salvar podemos conferir clicando sobre o arquivo. Abaixo estou exibindo um parte do arquivo macoratti.xls criado.
![]() |
O código fonte completo gerado no VWD é dado a seguir:
<%@ Import Namespace="System.IO" %>
<script language="VB" Runat="server"> Sub doExcel(ByVal Source As Object, ByVal E As EventArgs) If dgv.Rows.Count.ToString + 1 < 65536 Then dgv.AllowPaging = "False" dgv.DataBind() Dim tw As New StringWriter() Dim hw As New System.Web.UI.HtmlTextWriter(tw) Dim frm As HtmlForm = New HtmlForm() Response.ContentType = "application/vnd.ms-excel" Response.AddHeader("content-disposition", "attachment;filename=" & txtArquivo.Text & ".xls") Response.Charset = "" EnableViewState = False Controls.Add(frm) frm.Controls.Add(dgv) frm.RenderControl(hw) Response.Write(tw.ToString()) Response.End() dgv.AllowPaging = "True" dgv.DataBind() Else LblError.Text = " planilha possui muitas linhas, não é possível exportar para o EXcel" End If End Sub </script> <html> <head> <title>Exportando o conteúdo de um GridView para o Excel</title> </head> <body style="text-align: center"> <form id="fm1" runat="server"> <span style="font-size: 10pt; font-family: Verdana"> Informe o nome do arquivo(.xls)</span>: <asp:TextBox id="txtArquivo" Runat="server" /> <asp:GridView Runat="server" Id="dgv" GridLines="None" cellpadding="0" cellspacing="1" Headerstyle-BackColor="#768667" Headerstyle-Forecolor="#FFFFFF" Headerstyle-Font-Names="Verdana" Headerstyle-Font-Bold="True" Headerstyle-Font-Size="11" BackColor="#E0E0F6" Font-Names="Verdana" Font-Size="10" AlternatingRowStyle-BackColor="#EFEFEF" AlternatingRowStyle-Font-Names="Arial" AlternatingRowStyle-Font-Size="10" BorderColor="Black" DataKeyNames="ProductID" DataSourceID="sqlProdutos" AllowPaging="True" AutogenerateColumns="False"> <Columns> <asp:BoundField DataField="ProductID" HeaderText="Cod." ReadOnly="True"/> <asp:BoundField DataField="ProductName" HeaderText="Nome do Produto"/> <asp:BoundField DataField="SupplierID" HeaderText="Cod.Forn."/> <asp:BoundField DataField="CategoryID" HeaderText="Cod.Categ."/> <asp:BoundField DataField="QuantityPerUnit" HeaderText="Qtde"/> <asp:BoundField DataField="UnitPrice" HTMLEncode="False" DataformatString="{0:c}" HeaderText="Preço"/> <asp:BoundField DataField="UnitsInStock" HeaderText="Estoque"/> </Columns> </asp:GridView> <asp:Button id="btn" Text="Exportar para o Excel" onclick="doExcel" Runat="server" /> <p> <asp:Label ID="LblError" Runat="server" Font-Names="Arial" Font-Size="11pt" /> </p> <asp:SQLDataSource ID="sqlProdutos" Runat="Server" SelectCommand = "SELECT * From Products" ConnectionString="Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind; _ User ID=sa;password=;Data Source=MACORATI\VSDOTNET"> </asp:SQLDataSource> </form> </body> </html> |
Até mais ver ...
Gostou ?
Compartilhe no Facebook
Compartilhe no Twitter
Referências:
Visão geral do modelo de objeto Excel: http://msdn.microsoft.com/pt-br/library/wss56bz7.aspx