PHP é a Quinta-Feira – HEADERs (parte 2)
Por Pedro Peixoto para o PPLWARE A extracção para Excel é uma funcionalidade essencial nas aplicações WEB, uma vez que permite que um dado conjunto de dados seja exportado e posteriormente manipulado de uma forma mais adequada às necessidades individuais de cada utilizador. Existem já muitas soluções disponíveis, algumas gratuitas, que podem ser usadas, de modo a poupar o trabalho ao programador. Mas será que, precisamos de centenas de linhas de código para fazer uma tarefa destas? Não, hoje, damos continuidade ao último artigo (ver aqui), onde falámos sobre headers e vamos aprender como é possível, em três linhas de código, disponibilizar uma extracção de uma página HTML para Excel.
Em primeiro lugar vamos criar uma página simples com uma tabela para usarmos como exemplo.
Construímos um array de clientes.
<?php //os clientes poderiam ser lidos de uma base de dados, neste caso vamos escrever manualmente $clientes[1]=array('nome'=>'António Fialho','telefone'=>'982367832','email'=>'afialho@email.pt'); $clientes[2]=array('nome'=>'David Garcia','telefone'=>'982365645','email'=>'dgarcia@email.pt'); $clientes[3]=array('nome'=>'Ernesto Jorge','telefone'=>'985672462','email'=>'ernesto@email.pt'); ?> |
Para simplificar a leitura tenho por hábito alternar as cores das tabelas pelo que necessitamos de dois estilos:
<style> .l0{ background-color:#EFEFEF; } .l1{ background-color:#CFCFCF; } </style> |
Falta agora fazer o código que desenha a tabela:
<table> <thead> <tr> <th>Nome do cliente</th><th>Telefone</th><th>Email</th> </tr> </thead> <tbody> <?php foreach($clientes as $id=>$cliente) { //o resto da divisão do id por dois vai devolvendo 1 ou 0 conforme numero par ou impar //de seguida escrevo os dados do cliente echo ' <tr class="l' . $id%2 . '"> <td>' . $cliente['nome'] . '</td><td>' . $cliente['telefone'] . '</td><td>' . $cliente['email'] . '</td> </tr> '; } ?> </tbody> </table> |
E temos finalmente a nossa tabela:
Neste ponto temos uma página normal com uma tabela. Vamos agora perceber como é fácil adicionar a funcionalidade de extracção utilizando headers. Antes de mais, é necessário um link/botão de exportar para excel:
<a href="?export=excel">Exportar esta tabela para excel</a> |
O link para exportar aponta para a própria página, apenas adicionei uma variável GET “export” com o valor “excel”. Desta forma quando o link for clicado a página será recarregada mas a variável $_GET[‘export’] vai ter o valor “excel”.
Por último, e mais importante, temos que fazer uma verificação no início do ficheiro, se a variável $_GET[‘export’] for “excel” adicionamos os headers que permitem ao browser interpretar a página como um ficheiro excel:
if ($_GET['export']=='excel') { header("Content-Type: application/vnd.ms-excel"); header("Expires: 0"); header("Content-Disposition: attachment; filename=exportacao.xls"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); } |
Depois de clicar no link, é gerado o ficheiro Excel:
Como verificamos, o ficheiro foi gerado correctamente, podemos apenas fazer uma melhoria: quando exportamos para Excel não escrever o link final. Para isso vamos substituir código html do link pelo código PHP:
<!--?php If( empty($_GET['export'])) echo '<a href="?export=excel"-->Exportar esta tabela para excel'; ?> |
Temos finalmente o nosso script pronto.
<?php if ($_GET['export']=='excel') { header("Content-Type: application/vnd.ms-excel"); header("Expires: 0"); header("Content-Disposition: attachment; filename=exportacao.xls"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); } //os clientes poderiam ser lidos de uma base de dados, neste caso vamos escrever manualmente $clientes[1]=array('nome'=>'António Fialho','telefone'=>'982367832','email'=>'afialho@email.pt'); $clientes[2]=array('nome'=>'David Garcia','telefone'=>'982365645','email'=>'dgarcia@email.pt'); $clientes[3]=array('nome'=>'Ernesto Jorge','telefone'=>'985672462','email'=>'ernesto@email.pt'); ?> <html> <head> <title>Extracção Excel</title> <style> .l0{ background-color:#EFEFEF; } .l1{ background-color:#CFCFCF; } </style> </head> <body> <table> <thead> <tr> <th>Nome do cliente</th><th>Telefone</th><th>Email</th> </tr> </thead> <tbody> <?php foreach($clientes as $id=>$cliente) { //o resto da divisão do id por dois vai devolvendo 1 ou 0 conforme numeros par ou impar //de seguida escrevo os dados do cliente echo ' <tr class="l' . $id%2 . '"> <td>' . $cliente['nome'] . '</td><td>' . $cliente['telefone'] . '</td><td>' . $cliente['email'] . '</td> </tr> '; } ?> </tbody> </table> <?php if (empty($_GET['export'])) { echo '<a href="?export=excel">Exportar esta tabela para excel</a>'; } ?> </body </html> |
Foi difícil? Confuso? Em casos simples como este, é fácil adicionar esta funcionalidade à aplicação sem grandes complicações nem “ficheiros feitos”. No próximo artigo vou explicar como fazer um sistema simples de downloads.
Este artigo tem mais de um ano
nicee
Gostei imenso do artigo, continuem que eu agradeço 😉
gostei tb,á espera do proximo, que ainda vai dar mais jeito. 😉
Meus Parabéns, pela grande qualidade e versatilidade dos vários artigos apresentados, seja na área de programação ou noutra qualquer, sem qualquer tipo de dúvida o vosso painel de “posters” têm uma qualidade bem acima da média …
É para continuar 🙂 vou esperar pelo do downloads 🙂
Pedro adoro teus Post sobre PHP continue postando estamos no aguardo
Não pare …
Sucesso !
um offtopic em tom de sugestão: Uso de jQuery : Drag Drop onde o objecto que foi drop possa ser inserido numa BD. P.ex uma lista de dragables selecionar um ou vários da lista e “dropar” e submeter os que foram dropados numa BD (ou para finalidade de teste fazer um echo do que foi dropado. CUmpz.
Estes tutoriais de PHP são do meu interesse.
Gostaria que continuassem com mais destes tutoriais.
Além de fazerem crescer a comunidade de programadores nacionais, aínda criam uma legião maior de seguidores!!! 😀
Espero antentamente por novos tutoriais e/ou dicas!!
Cumprimentos
Gostaria de saber o código fonte para fazer um formulário de contacto com os seguintes campos:
– Nome
– Telefone
– Email
– Assunto
Botão Enviar;
Botão Limpar;
O contacto foi enviado com sucesso. Entrarei em contato o mais brevemente possível.