Adobe Flex, ASP.NET MVC, Silverlight, WPF e SQL Server
Adobe Flex – Exportar Datagrid para Excel
Se você é um desenvolvedor Flex de sistemas gerenciais com consultas ad-hoc como eu, se ainda não precisou, com certeza um dia irá precisar exportar os dados de uma Datagrid para o Microsoft Excel.
Abaixo mostrarei como realizar essa exportação.
Primeiramente precisamos construir nossa aplicação no Adobe Flex, para obter o resultado acima, copie o código abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> <mx:Script> <![CDATA[ [Bindable] private var dp:Array = [ { symbol: "ADBE", name: "Adobe Systems Inc.", price1: 49.95, price2: 49.95, price3: 49.95, price4: 49.95, price5: 49.95 }, { symbol: "MACR", name: "Macromedia Inc.", price1: 49.95, price2: 49.95, price3: 49.95, price4: 49.95, price5: 49.95 }, { symbol: "MSFT", name: "Microsoft Corp.", price1: 49.95, price2: 49.95, price3: 49.95, price4: 49.95, price5: 49.95 }, { symbol: "IBM", name: "IBM Corp.", price1: 49.95, price2: 49.95, price3: 49.95, price4: 49.95, price5: 49.95 }, { symbol: "ADBE", name: "Adobe Systems Inc.", price1: 49.95, price2: 49.95, price3: 49.95, price4: 49.95, price5: 49.95 }, { symbol: "MACR", name: "Macromedia Inc.", price1: 49.95, price2: 49.95, price3: 49.95, price4: 49.95, price5: 49.95 } ]; ]]> </mx:Script> <mx:DataGrid id="dgDado" y="40" dataProvider="{dp}" horizontalCenter="0"/> <mx:Button y="10" label="Exportar para o Excel" horizontalCenter="0" id="btExportar"/> </mx:Application> |
Agora vem o primeiro pulo do gato, crie uma classe no Flex chamada DataGridExporter, em meu exemplo salvei a classe no diretório br.com.igormusardo.datagrid.
Nesta classe, temos duas funções loadDGInExcel e convertDGToHTMLTable, essas funções são responsáveis por receber uma Datagrid como parâmetro, ler o seu conteúdo, criar o código HTML que represente a DataGrid e finalmente passar o HTML gerado como parâmetro de uma página, no meu caso ASP.NET mas pode ser feito em PHP ou JSP, informada na variável urlExcelExport para que a aplicação server-side gere o arquivo .XLS e forçe o download para o cliente. Para tanto copie o código abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 | package br.com.igormusardo.datagrid { import flash.errors.*; import flash.events.*; import flash.external.*; import flash.net.URLRequest; import flash.net.URLRequestMethod; import flash.net.URLVariables; import flash.net.navigateToURL; public class DataGridExporter { //Aplicação servidor que gerará o excel public var urlExcelExport:String = "ExcelExport.aspx"; // Converte a datagrid para uma tabela html private function convertDGToHTMLTable(dg:*):String { var font:String = dg.getStyle('fontFamily'); var size:String = (int(dg.getStyle('fontSize'))-2).toString(); //Reduz em 2, o tamanho da fonte. var str:String = ''; var colors:String = ''; var style:String = 'style="font-family:'+font+';font-size:'+size+'pt;"'; var hcolor:Array; if(dg.getStyle("headerColor") != undefined) { hcolor = [dg.getStyle("headerColor")]; } else { hcolor = dg.getStyle("headerColors"); } str+= '<table width="'+dg.width+'"><thead><tr width="'+dg.width+'" style="background-color:#' +Number((hcolor[0])).toString(16)+'">'; for(var i:int = 0;i<dg.columns.length;i++) { colors = dg.getStyle("themeColor"); if(dg.columns[i].headerText != undefined && dg.columns[i].visible == true) { str+="<th "+style+">"+dg.columns[i].headerText+"</th>"; } else if (dg.columns[i].visible == true) { str+= "<th "+style+">"+dg.columns[i].dataField+"</th>"; } } str += "</tr></thead><tbody>"; colors = dg.getStyle("alternatingRowColors"); for(var j:int =0;j<dg.dataProvider.length;j++) { str+="<tr width=\""+Math.ceil(dg.width)+"\">"; for(var k:int=0; k < dg.columns.length; k++) { if(dg.dataProvider.getItemAt(j) != undefined && dg.dataProvider.getItemAt(j) != null && dg.columns[k].visible == true && dg.columns[k].dataField != "Melhor") { if(dg.columns[k].labelFunction != undefined && dg.columns[k].labelFunction != null && dg.columns[k].visible == true) { str += "<td nowrap=\"nowrap\" width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+dg.columns[k].labelFunction(dg.dataProvider[j],dg.columns[k])+"</td>"; } else { str += "<td nowrap=\"nowrap\" width=\""+Math.ceil(dg.columns[k].width)+"\" "+style+">"+dg.dataProvider.getItemAt(j)[dg.columns[k].dataField]+"</td>"; } } } str += "</tr>"; } str+="</tbody></table>"; return str; } // Envia o HTML para a aplicação servidor public function loadDGInExcel(dg:*):void { var variables:URLVariables = new URLVariables(); variables.htmltable = convertDGToHTMLTable(dg); var u:URLRequest = new URLRequest(urlExcelExport); u.data = variables; u.method = URLRequestMethod.POST; navigateToURL(u,"_self"); } } } |
Após criada a classe, é necessário atribiuir uma função que executará o loadDGInExcel. Inclua o código abaixo ao seu código fonte action script.
1 2 3 4 5 | private function exportar():void { var dgE:DataGridExporter = new DataGridExporter(); dgE.loadDGInExcel(dgDado); } |
E por fim, atribua a função exportar() ao click do botão, como o código abaixo.
1 | <mx:Button y="10" label="Exportar para o Excel" horizontalCenter="0" id="btExportar" click="{exportar()}"/> |
Pronto, no Adobe Flex, não é necessário fazer mais nenhuma alteração, agora o trabalho fica por conta da aplicação server-side. No Visual Studio, crie um novo arquivo chamado de ExcelExport.aspx, e inclua a tag ValidateRequest=”false” no cabeçalho do arquivo aspx, como abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <%@ Page Language="vb" ValidateRequest="false" AutoEventWireup="false" CodeBehind="ExcelExport.aspx.vb" Inherits="Flex.ExcelExport" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
</div>
</form>
</body>
</html> |
A parte de codificação, receberá o parâmetro htmltable, vindo do Flex que renderizará com o ContentType “application/vnd.ms-excel” com o nome de ExportaExcel.xls tudo isso dentro da função Page Load.
1 2 3 4 5 6 7 8 9 10 | Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Response.Clear() Response.ContentType = "application/vnd.ms-excel" Response.AddHeader("content-disposition", "attachment;filename=ExportaExcel.xls") Response.Charset = "" EnableViewState = False Request.ContentEncoding = System.Text.Encoding.UTF8 Response.Write(Request("htmltable")) Response.End() End Sub |
Dessa forma, quando o Flex enviar o htmltable, o navegador exibirá a janela padrão de download, para o arquivo recém criado.
E pronto! Sua aplicação Adobe Flex já exporta os dados de uma Datagrid para o Excel.
Duvídas e feedbacks são sempre muito bem-vindos.
Sucesso e divirta-se.
Posts similares
- Blist: banco de dados online, gratuito e feito em Adobe Flex
- Adobe Max 2008: Visual Studio, Flex e AMF
- Upload utilizando Adobe Flex e ASP.NET
- WebCast - Integrando ASP.NET + Adobe Flex com WebOrb
- Artigo - Construindo aplicações ricas com Adobe Flex 3 e ASP.NET na revista Mundo .NET
- WebOrb 3.6 para .NET está disponível
- Construindo aplicações ricas de internet com Adobe Flex 3 e ASP.NET
- Decisões corretas através de dashboards dinâmicos em Flex e ASP.NET MVC
- Adobe Flex: Trocar de figura no DataGrid de acordo com o DataProvider
- Modelo de consultas e relatórios ad-hoc no Adobe Flex
| Imprimir artigo | Este artigo foi escrito por Igor Musardo em October, 28 2008 às 10:48 am, e está arquivado em .NET, Adobe Flex. Siga quaisquer respostas a este artigo através do RSS 2.0. Você pode deixar uma resposta ou fazer um trackback do seu próprio site. |














há 1 ano atrás
Oi Igor, parabéns pelo exemplo, está simples, prático e funcional.
Só gostaria de acrescentar que é possível exportar para o Word modificando o content-type do Response:
Response.ContentType = “application/vnd.ms-word”
E exportar como ExportaDados.doc.
Abraços.
há 1 ano atrás
João Paulo, primeiramente, obrigado pelo seu Feedback.
De fato, alterando o ContentType o sistema passa a exportar para outros formatos!
Valeu a sugestão!!!
há 1 ano atrás
Olá Igor…mt bom o exemplo…inclusive ja estou usando em um projeto aqui…e te agradeco por ter me ajudado bastante c/ este exemplo…
Bom…gostaria de saber se vc tem algum interesse de fazer um exemplo exportando os charts do flex pra pdf ou importar em um excel…
agradeco…
há 1 ano atrás
Lembrando que dá pra fazer a exportação sem precisar do .NET (ou outra linguagem). Basta importar a classe FILEREFERENCE e salvar o html gerado:
var fr:FileReference = new FileReference();
fr.save(str,”arquivo.xls”);
há 1 ano atrás
Ótima dica @Berkowitz, valeu!
há 1 ano atrás
Campeão…como ficaria os 2 arquivos em PHP? E aonde devo colocá-los?
há 1 ano atrás
@Farnetani, infelizmente não conseguirei te auxiliar com relação ao PHP pois possuo pouco conhecimento sobre essa tecnologia.
há 1 ano atrás
Nao entendi onde se deve colocar o ultimo codigo com o protected sub…
há 1 ano atrás
achei muito util a sua matéria
há 1 ano atrás
Para quem quer utilizar PHP, código ficaria da seguinte forma:
<?php
header('ETag: etagforie7download'); //IE7 requires this header
header('Content-type: application/octet_stream');
header('Content-disposition: attachment; filename="rapportage.xls"');
//Add html tags, so that excel can interpret it
echo "
“.stripslashes($_POST["htmltable"]).”
“;
?>
Cole esse código para o arquivo ExcelExport.php
Até +++
há 1 ano atrás
Meus Parabens, otimo conteudo.
Estou tendo um pouco de dificuldade, como que eu posso montar esse codigo utilizado o java…
há 1 ano atrás
Maravilha cara, funciona perfeitamente com PHP.
Obrigado pelo Post!!!!
há 1 ano atrás
Caros,
Alguem conseguiu usando java… ?
Abraços
há 1 ano atrás
Parabéns pelo artigo, muito bom.
Aproveitando: alguém conseguiu fazer em jsp? tentei e não consegui. Pelo .NET foi ok…
há 4 meses atrás
Excelente e simples do jeito que deve ser e do jeito que gosto….. hehehehhehehhehehhe….. mas e o inverso segue a mesma lógica????? sou novo no mundo do desenvolvimento…….