Olá pessoal, como vão?
Hoje vamos aprender a selecionar dados de uma tabela e exportar para Excel (*.xls), recurso bastante útil para relatórios, informativos e etc..
Bom, como um digno #soudev que sou, rs, o recheio da minha tabela será os nomes de nossos amigos desenvolvedores, e além de ser utilizada para o exemplo, no final do post, ao clicar no link para o algoritmo entrar em ação você vai ganhar uma planilha com nomes e os respectivos perfis no twitter para você seguir!
Aqui tenho minha tabela:
A lógica do algoritmo será em basicamente executar uma query no banco, trazer os dados, inserir em um array e forçar o download. Simples né?
Vou explicar separadamente parte por parte e no final disponibilizo o algoritmo inteiro, ok?
Parte 1:
Realizamos uma query no banco, e no caso como quero todos os dados da tabela não será preciso impor condições na query.
A variável ‘$contar’ usarei para contar todas as linhas retornadas da consulta, por meio da função mysql_num_rows(), utilizaremos mais pra frente!
1 2 3 | $query = "SELECT * FROM exemplo_1"; $executar_query = mysql_query($query); $contar = mysql_num_rows($executar_query); |
Parte 2:
Agora faremos um loop, usando um for para criar o cabeçalho da nossa planilha, utilizará a posição [0] do array ‘$html’.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | for($i=0;$i<1;$i++){ $html[$i] = ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= " <table> <tbody> <tr> <td><b>Nome</b></td> <td><b>Twitter</b></td> </tr> </tbody> </table> "; } |
Parte 3:
Nesta parte, vamos trazer os dados do banco em forma de array, utilizando a função mysql_fetch_array() como normalmente fazemos, as únicas diferenças são que: logo no início eu declaro que minha variável ‘$i’ agora vale 1, pois este será o ponteiro para indicar em que posição do array ‘$html’ eu vou inserir as tabelas HTML, e como no loop anterior eu coloquei o cabeçalho na posição [0], agora preciso inserir os dados da posição [1] em diante..
Seguindo então a execução do algoritmo:
Meu ‘$i’ vale 1 e enquanto houver dados vindos do banco, a minha variável ‘$retorno_nome’ corresponderá a posição [‘nome’] e ‘$retorno_twitter’ a posição [‘twitter’] dentro do array (trata-se de arrays associativos). Na sequência alimento a tabela com as variáveis ‘$retorno_nome’ e ‘$retorno_twitter’ dentro do array ‘$html’ na posição correspondente ao valor atual da variável ‘$i’, ao final disso somo 1 a nossa tão útil variável ‘$i’.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | $i = 1; while($ret = mysql_fetch_array($executar_query)){ $retorno_nome = $ret['nome']; $retorno_twitter = $ret['twitter']; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= " <table> <tbody> <tr> <td>$retorno_nome</td> <td>$retorno_twitter</td> </tr> </tbody> </table> "; $i++; } |
Parte 4:
Bom, nesta altura já temos todos os dados do banco dentro do nosso array ‘$html’, prontos para usarmos.
Agora vamos informar ao php qual será o nome do nosso .XLS, para isso criamos a variável $arquivo que receberá este nome.
1 | $arquivo = 'soudev.xls'; |
Parte 5:
Em seguida iremos passar parâmetros a função header() que irá, na ordem:
Determinar até quando este arquivo ficará em cache;
Indicar a data de última modificação;
Indicar que o arquivo não deverá ficar no cache, forçando o seu reprocessamento.
Mudar o tipo do arquivo;
Forçar o download, informando o nome do arquivo, no nosso caso será a variável ‘$arquivo’.
1 2 3 4 5 6 7 8 | $arquivo = 'soudev.xls'; header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header ("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); header ("Cache-Control: no-cache, must-revalidate"); header ("Pragma: no-cache"); header ("Content-type: application/x-msexcel"); header ("Content-Disposition: attachment; filename={$arquivo}" ); header ("Content-Description: PHP Generated Data" ); |
Parte 6:
E por final, realizo outro loop para imprimir este array no nosso arquivo XLS, nesta altura já posso substituir o valor do nosso ponteiro ‘$i’, pois não irá afetar em nada.
Lembra-se que no ínicio, declarei uma variável ‘$contar’? (Caso não lembre, veja lá em cima), bom nesta variável temos o valor de todas as linhas retornadas da consulta, sendo assim informo pro meu loop até onde ele deve parar, e escrevo cada posição do array.
1 2 3 | for($i=0;$i<=$contar;$i++){ echo $html[$i]; } |
Feito, ao acessar esta página você receberá o arquivo XLS, sem nenhuma página sendo exibida, ou seja, este algoritmo deverá ser a página link de por exemplo, um botão de exportar dados.
Existem diversas maneiras de exportarmos dados de um banco para XLS, CSV e esta é uma delas, espero que tenham entendido e gostado, caso exista dúvidas fiquem a vontade em perguntar.
Clique aqui para visualizar o arquivo XLS gerado com este exemplo.
E abaixo segue o algoritmo completo:
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 | <!--?php include 'conexao.php'; $query = "SELECT * FROM exemplo_1"; $executar_query = mysql_query($query); $contar = mysql_num_rows($executar_query); for($i=0;$i<1;$i++){ $html[$i] = ""; $html[$i] .= "<table-->"; $html[$i] .= ""; $html[$i] .= "<b>Nome</b>"; $html[$i] .= "<b>Twitter</b>"; $html[$i] .= ""; $html[$i] .= ""; } $i = 1; while($ret = mysql_fetch_array($executar_query)){ $retorno_nome = $ret['nome']; $retorno_twitter = $ret['twitter']; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= ""; $html[$i] .= " <table> <tbody> <tr> <td>$retorno_nome</td> <td>$retorno_twitter</td> </tr> </tbody> </table> "; $i++; } $arquivo = 'soudev.xls'; header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header ("Last-Modified: " . gmdate("D,d M YH:i:s") . " GMT"); header ("Cache-Control: no-cache, must-revalidate"); header ("Pragma: no-cache"); header ("Content-type: application/x-msexcel"); header ("Content-Disposition: attachment; filename={$arquivo}" ); header ("Content-Description: PHP Generated Data" ); for($i=0;$i<=$contar;$i++){ echo $html[$i]; } ?> |
Forte Abraço!
E vamos lá, amanhã Brasil 4 x 0 Portugal, rs.