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.
Quem leu esse post, também leu...
- 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 outubro, 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á 3 anos 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á 3 anos 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á 3 anos 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á 3 anos 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á 3 anos atrás
Ótima dica @Berkowitz, valeu!
há 3 anos atrás
Campeão…como ficaria os 2 arquivos em PHP? E aonde devo colocá-los?
há 3 anos atrás
@Farnetani, infelizmente não conseguirei te auxiliar com relação ao PHP pois possuo pouco conhecimento sobre essa tecnologia.
há 3 anos atrás
Nao entendi onde se deve colocar o ultimo codigo com o protected sub…
há 2 anos atrás
achei muito util a sua matéria
há 2 anos 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á 2 anos atrás
Meus Parabens, otimo conteudo.
Estou tendo um pouco de dificuldade, como que eu posso montar esse codigo utilizado o java…
há 2 anos atrás
Maravilha cara, funciona perfeitamente com PHP.
Obrigado pelo Post!!!!
há 2 anos atrás
Caros,
Alguem conseguiu usando java… ?
Abraços
há 2 anos 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á 2 anos 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…….
há 1 ano atrás
ola!
Muito bom seu site bom, me ajudou um montão.
mais gostaria de aproveitar para lhe fazer uma pergunta que parece ser básica, mais ja andei na net um bom tempo e não achei nada sobre isso.
coloquei um icone numa coluna como seu exemplo no site, só que ele não mostra simplesmente só aparece um quadrado aonde deveria aparecer o desenho do icone.pode me dar uma força nesse sentido?
deste agradeço pela atenção
há 1 ano atrás
Igor,
PARABÉNS pelo post. Super fácil de entender e muito providencial. Eu estava precisando exatamente de uma rotina que fizesse este tipo de exportação.
Agradeço tb ao “Berkowitz ” pelo dica de utilizar a classe FIleReference para gerar o arquivo diretamente no flex.
Obrigado a vcs pela ajuda e novamente Parabéns Igor pelo post e pelo blog em geral.
há 10 meses atrás
Estou com a seguinte situação:
Tenho uma coluna no meu datagrid onde tenho o código do pedido (Ex: 8457888544000015), quando eu envio para o excel ele substitui o “15″ por “00″ então ele chega no excel da seguinte forma: 8457888544000000. Isso devido ao fato da solução entender que é um campo numerico. Onde posso ta mostrando para a aplicação que esse campo é um texto? Na saida do flex está ok, é no momento da geração do excel que está dando o problema.
Abraços