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:


José Carlos Macoratti