OBS: Download disponível no final do artigo
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;
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. 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