Sie sind auf Seite 1von 7

ASP.

NET - Exportando um DataGrid para o Excel


Continuando a nossa saga de interagir com o Excel, ja vimos como podemos
importar dados de uma planilha ; neste artigo vamos ver como fazer o caminho de volta para o Excel, ou seja , exportar dados de um datagrid para o Excel. Neste artigo eu vou usar o Web Matrix e o seu servidor para testar o exemplo que vamos tratar. O exemplo foi testado em uma mquina com Windows XP e a verso do Excel instalada era a Excel 97 SR1 (no riam...) O objetivo abrir uma tabela Customers/Clientes do banco de dados Northwind.mdb , exibir os dados em um componente DataGrid e a seguir exportar para um arquivo Excel. Abra o Web Matrix e crie uma pgina ASP.NET , eu chamei a pgina de AspNetExcel.aspx. A seguir salve a pgina em um diretrio virtual. Na guia Desing do Web Matrix inclua um componente DataGrid que vou chamar apenas dg. Inclua tambm um TextBox - id=txtNomeArq -e um boto de comando - id=btnExportar. Conforme o layout abaixo:

Como vamos acessar uma base de dados Access usando OleDB sero necessrios os seguintes imports:

<%@ Page Language="vb" %> <%@ import Namespace="System.Data" %> <%@ import Namespace="System.Data.OleDb" %>
Na guia Code vamos incluir o cdigo no evento Load do formulrio conforme

abaixo. Este cdigo apenas seleciona os registros da tabela Clientes/Customers e exibe o resultado no DataGrid.

Sub Page_Load(Source as Object, E as EventArgs) Dim strConn as string = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\teste\Northwind.mdb" 'seleciona as primeiras 10 linhas da tabela Costumers Dim strSql as string = "Select Top 10 * from Clientes" 'cria uma nova conexao OLedb Dim con as New OleDbConnection(strConn) 'cria um dataset Dim ds as DataSet=New DataSet() 'cria um commando usando o DataAdapter Dim Cmd as New OleDbDataAdapter(strSql,con) 'preenche o dataset com os dados da tabela Cmd.Fill(ds,"Clientes") 'exibe os dados no datagrid dg.Datasource=ds.Tables("Clientes").DefaultView dg.DataBind() End Sub Abaixo o resultado da execuo do cdigo do evento Load.

A seguir temos o cdigo que ser executado quando o evento Click do boto Exportar para o Excel . for acionado. ( <asp:Button id="btnExportar" onclick="exportar" Runat="server" Text="Exportar para o Excel"></asp:Button>) Sub exportar(Source as Object, E as EventArgs) exportarExcel(dg,txtnomeArq.text) End Sub A rotina exportar aciona a rotina exportarExcel() passando como parmetro o datagrid e o nome do arquivo sem a extenso. Abaixo temos o cdigo da rotinaexportarExcel() Sub exportarExcel(grid As DataGrid, saveAsFile As String) ' O limite de linhas do Excel 65536 If grid.Items.Count.ToString + 1 < 65536 Then HttpContext.Current.Response.Clear() HttpContext.Current.Response.ContentType = "application/vnd.ms-excel" HttpContext.Current.Response.AddHeader("contentdisposition", "attachment;filename=" & saveAsFile & ".xls") ' Remover caracteres do header - Content-Type HttpContext.Current.Response.Charset = "" ' desabilita o view state.

grid.EnableViewState = False Dim tw As New System.IO.StringWriter() Dim hw As New System.Web.UI.HtmlTextWriter(tw) grid.RenderControl(hw) ' Escrever o html no navegador HttpContext.Current.Response.Write(tw.ToString()) ' termina o response HttpContext.Current.Response.End() Else HttpContext.Current.Response.Write("Muitas linhas para exportar para o Exel !!!") End If End Sub

Aps informar o nome do arquivo e clicar no boto - Exportar para o Excel teremos o seguinte resultado: 1- Uma janela de dilogo ser aberta solicitando a confirmao para Salvar o arquivo

2- Em seguida a janela Salvar como ir solicitar o local onde deseja salvar o arquivo.

O cdigo que vale a pena destacar o seguinte : HttpContext.Current.Response.Clear() HttpContext.Current.Response.ContentType = "application/vnd.ms-excel" HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" & saveAsFile & ".xls") Neste cdigo a classe HttpContext usada para definir o tipo de contedo da pgina como sendo : "application/vnd.ms-excel" Obs: Veja tambm o artigo - ASP.NET -Persistindo valores entre Web Forms.onde usamos a classe HttpContext A propriedade Current da classe HttpContext obtm o objeto HttpContext para a requisio HTTP atual. O mtodo AddHeader inclui um cabealho HTTP na saida do stream. Este mtodo fornecido por questo de compatibilidade com o ASP. No cabealho estamos definindo que o arquivo um anexo e ser salvo com a extenso .xls:

"content-disposition", "attachment;filename=" & saveAsFile & ".xls"


Aps salvar o arquivo se abrirmos o arquivo no Excel iremos obter o seguinte:

que exatamente o contedo do datagrid. Bingo... Usando a mesma classe poderamos ter gerado um arquivo no formato do Word usando o seguinte cdigo : HttpContext.Current.Response.Clear() HttpContext.Current.Response.ClearContent() HttpContext.Current.Response.ClearHeaders() HttpContext.Current.Response.Buffer =true HttpContext.Current.Response.ContentType="application/msword" HttpContext.Current.Response.Write("<!DOCTYPE HTML PUBLIC ""//W3C//DTD HTML 4.0 Transitional//EN"">") 'HttpContext.Current.Response.AddHeader("ContentDisposition","attachment;filename=teste_gera.doc") HttpContext.Current.Response.AddHeader("content-disposition", "inline; filename=ExportaWord.doc") HttpContext.Current.Response.Charset = "utf-8" HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250") HttpContext.Current.Response.Write("<font style='font-size:10.0pt; font-family:Verdana;'>") HttpContext.Current.Response.Write("<BR><BR><BR>") HttpContext.Current.Response.Write("<Table border='1' bgColor='#ffffff' borderColor='#ffffff' cellSpacing='0' _ cellPadding='0' style='font-size:10.0pt; fontfamily:Verdana; background:white;border-collapse:collapse;_ border:none;mso-border-alt:solid white .5pt;mso-borderright-alt:dotted white .5pt; mso-padding-alt:0in _ 0in 0in 0in;mso-border-insideh:.5pt dotted white; msoborder-insidev:.5pt dotted white'> <TR> _ <TD width=300>") HttpContext.Current.Response.Write("primeira linha da primeira clula de dados") HttpContext.Current.Response.Write("</Td><TD>")

HttpContext.Current.Response.Write("Primeira linha segunda clula") HttpContext.Current.Response.Write("</Td></TR><TR><TD width=300>") HttpContext.Current.Response.Write("segunda linha primeira clula") HttpContext.Current.Response.Write("</Td><TD>") HttpContext.Current.Response.Write("segunda linha segunda clula") HttpContext.Current.Response.Write("</Td></TR></TABLE>") HttpContext.Current.Response.Write("<BR><BR><BR>") HttpContext.Current.Response.Write("<U>") HttpContext.Current.Response.Write("dados sublinhados") HttpContext.Current.Response.Write("</U>") HttpContext.Current.Response.Write("<BR><BR><BR>") HttpContext.Current.Response.Write("<P>") HttpContext.Current.Response.Write("Pargrafo com linha nica. Data de hoje formatada::") HttpContext.Current.Response.Write(String.Format("{0:d-MMMM-yyyy}", DateTime.Now)) HttpContext.Current.Response.Write("</P>") HttpContext.Current.Response.Write("</font>") HttpContext.Current.Response.Flush() HttpContext.Current.Response.End()

Pegue o cdigo completo aqui :

AspNetExcel.zip

Das könnte Ihnen auch gefallen