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.

php_00

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:

tabela_00 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:

tabela_01

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.

  
     Pin It  

Arquivado na categoria: PHP, Tutoriais


7 Comentários

  1. Gostei imenso do artigo, continuem que eu agradeço ;)

  2. gostei tb,á espera do proximo, que ainda vai dar mais jeito. ;)

  3. 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 …

  4. É para continuar :) vou esperar pelo do downloads :)

  5. Pedro adoro teus Post sobre PHP continue postando estamos no aguardo

    Não pare …

    Sucesso !

  6. 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.

Deixe o seu comentário

Aviso: Todo e qualquer texto publicado na internet através deste sistema não reflete, necessariamente, a opinião deste site ou do(s) seu(s) autor(es). Os comentários publicados através deste sistema são de exclusiva e integral responsabilidade e autoria dos leitores que dele fizerem uso. O autor deste site reserva-se, desde já, o direito de excluir comentários e textos que julgar ofensivos, difamatórios, caluniosos, preconceituosos ou de alguma forma prejudiciais a terceiros. Textos de caráter promocional ou inseridos no sistema sem a devida identificação do seu autor (nome completo e endereço válido de email) também poderão ser excluídos.