loader image

Como gerar um arquivo do Excel com PHP

A forma mais simples de gerar um arquivo em Excel é usando o header application/vnd.ms-excel do PHP e esta solução por ser eficiente em algumas situações, mas não em todas. Este exemplo demonstra como fazer isso;

<?php
 header("Content-type: application/vnd.ms-excel");
 header("Content-type: application/force-download");
 header("Content-Disposition: attachment; filename=teste.xls");
 header("Pragma: no-cache");
?>

<meta charset='utf-8'>
<table>
    <tr>
        <td>Cliente</td>
        <td>Data da Comprar</td>
        <td>Valor</td>
        <td>Produto</td>
    </tr>
    <tr>
        <td>Anderson</td>
        <td>22/05/2016</td>
        <td>R$ 56,00</td>
        <td>Lanche</td>
    </tr>
    <tr>
        <td>Sergio</td>
        <td>25/05/2016</td>
        <td>R$ 76,00</td>
        <td>Almoço</td>
    </tr>
</table>

Este código pode ser encontrado facilmente nas pesquisas da WEB, mas ele possui um grande problema, o Excel não entende o conteúdo do arquivo como células e colunas e sim, entende como um conteúdo HTML, tanto que sempre que abrimos o arquivo o Excel apresenta a seguinte mensagem;

Outro grande problema é que este código força o download e em determinadas situações precisamos apenas gerar o arquivo e salvá-lo no servidor.

Por estes dois motivos, para mim, a forma mais simples é criar um arquivo CSV e depois converter para XLS usando a biblioteca PHPExcel. Digo isso pela quantidade de código envolvido e a quantidade de testes que preciso fazer para ter certeza de que tudo está funcionando, além disso, não preciso de nenhuma extensão adicional do PHP rodando no servidor, a classe PHPExcel faz praticamente quase todo o serviço para mim.

Criando um arquivo CSV com PHP

O código a seguir é um clássico do PHP, a função fwrite() nos permite gravar arquivos de textos simples. Para esta aula de hoje eu irei usar o fwrite() para gerar um arquivo texto contendo todos os dados de uma consulta SQL e irei salvar este arquivo com a extensão XLS do Excel.

Se você já trabalhou com CSV, deve saber que tratá-se de valores separados com um ponto e vírgula, portanto, a sintaxe código seria esta;

// Gera arquivo CSV
    $fp = fopen("arquivo.csv", "w"); // o "a" indica que o arquivo será sobrescrito sempre que esta função for executada.
    $escreve = fwrite($fp, "\n$conteudoColuna1;$conteudoColuna2;$conteudoColuna3");
    fclose($fp);

Dica: Se estiver com problemas de caracteres latinos, utilize a função utf8_encode(), ficando assim; $escreve = fwrite($fp, utf8_encode("\n$conteudoColuna1;$conteudoColuna2;$conteudoColuna3"));

Convertendo um arquivo CSV para XLS do Excel com PHP

O outro bloco de código que irei usar neste projeto é a conversão do CSV para XLS. Para isso é necessário fazer o download do código no gitHub, acesse a página do projeto PHPExcel no GitHub.

Com a biblioteca devidamente copiada para o seu projeto, bastará usar o código a seguir para fazer a conversão.

// Converte para XLS
    include("PHPExcel/Classes/PHPExcel/IOFactory.php");
    $objReader = PHPExcel_IOFactory::createReader('CSV');
    $objReader->setDelimiter(";"); // define que a separação dos dados é feita por ponto e vírgula
    $objReader->setInputEncoding('UTF-8'); // habilita os caracteres latinos.
    $objPHPExcel = $objReader->load('arquivo.csv'); //indica qual o arquivo CSV que será convertido
    $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
    $objWriter->save('arquivo.xls'); // Resultado da conversão; um arquivo do EXCEL    

Agora com estes dois códigos em mãos, posso então criar uma pequena aplicação PHP.

Exemplo prático, exportando uma consulta MySQL para Excel usando PHP

Para este exemplo vou usar o projeto disponível aqui no Blogson – Consulta de dados com Ajax .

Embora este projeto utilize AJAX para fazer consulta ao banco de dados, Obviamente que você não precisa utilizá-lo, o mais importante aqui é saber aplicar os códigos demonstrado acima.

Vamos acrescentar no nosso projeto um botão de exportação para o Excel, ficando assim;

Exemplo de como exportados dados do MySQL para Excel usando PHP e convertendo arquivos CSV para XLS do Excel

Aplicando os códigos descritos acima, o código da consulta ficaria assim:

<?php
	/* prepara o documento para comunicação com o JSON, as duas linhas a seguir são obrigatórias 
	  para que o PHP saiba que irá se comunicar com o JSON, elas sempre devem estar no ínicio da página */
	header("Access-Control-Allow-Origin: *");
	header("Content-Type: application/json; charset=utf-8");

    include("dados-conexao.php");

	try {
		$conecta = new PDO("mysql:host=$servidor;dbname=$banco", $usuario , $senha);
		$conecta->exec("set names utf8"); // Permite caracteres latinos.
		$consulta = $conecta->prepare('SELECT * FROM tb01_bandas');				
        $consulta->execute(array());  
		$resultadoDaConsulta = $consulta->fetchAll();
		

    
		$StringJson = "["; 
	    if ( count($resultadoDaConsulta) ) {
			
			// Gera arquivo CSV
			$fp = fopen("bandas.csv", "a"); // o "a" indica que o arquivo será sobrescrito sempre que esta função for executada.
			$escreve = fwrite($fp, "Banda;Estilo;Ano;Descrição");
			
			foreach($resultadoDaConsulta as $registro) 
			{ 		  			
				$escreve = fwrite($fp, "\n$registro[banda_nome];$registro[banda_estilo];$registro[banda_ano];$registro[banda_descricao]");			  
				if ($StringJson != "[") {$StringJson .= ",";}
				$StringJson .= '{"banda_nome":"' . $registro['banda_nome']  . '",';
				$StringJson .= '"banda_estilo":"' . $registro['banda_estilo']  . '",';	
				$StringJson .= '"banda_ano":"' . $registro['banda_ano']    . '",';	
				$StringJson .= '"banda_descricao":"' . $registro['banda_descricao'] . '"}';
		      }  
		echo $StringJson . "]"; // Exibe o vettor JSON
		
		fclose($fp);
		// Converte para XLS
		include("PHPExcel/Classes/PHPExcel/IOFactory.php");
		$objReader = PHPExcel_IOFactory::createReader('CSV');
		$objReader->setDelimiter(";"); // define que a separação dos dados é feita por ponto e vírgula
		$objReader->setInputEncoding('UTF-8'); // habilita os caracteres latinos.
		$objPHPExcel = $objReader->load('bandas.csv'); //indica qual o arquivo CSV que será convertido
		$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5');
		$objWriter->save('bandas.xls'); // Resultado da conversão; um arquivo do EXCEL   
		
        } 
    } catch(PDOException $e) {
        echo 'ERROR: ' . $e->getMessage(); // opcional, apenas para teste
    }  
?>

Prontinho! Agora é só colocar o link do botão;

<a href=".\core\bandas.xls">
<button type="button" class="btn">Exportar para o Excel</button>
</a>

Eis o resultado final;

Download do exemplo

Você pode baixar o projeto 100% funcional aqui. O projeto foi montado usando o XAMPP e o banco de dados está incluso. Bons estudos.

Como gerar um arquivo do Word com PHP

Se você estiver procurando um exemplo de como fazer a exportação para um arquivo .DOC do Word, leia então este outro artigo – Como criar um arquivo do Word (.DOC) com PHP

Deixe seu comentário