Atualizado em 08 de Janeiro de 2014

Exportando Dados do MySQL para Excel com PHP

Olá pessoal,

Exportar dados de um programa para outro e muito comum ainda mais quando estamos trabalhando com dados que necessitam de análise, um dos programas mais usados para análise de dados é o Excel, por este motivo neste post vou mostrar como exportar os dados do MySQL para o Excel com o PHP.

Em nosso exemplo não vou explicar como fazer conexão com o banco de dados, caso você seja iniciante em PHP visite o nosso Curso de PHP Básico para aprender passo a passo esta fantástica linguagem de programação.

Então vamos ao script:

<?php
// Inclui a conexão
include_once('conexao.php');

// Nome do Arquivo do Excel que será gerado
$arquivo = 'dados_emails.xls';

// Criamos uma tabela HTML com o formato da planilha para excel
$tabela = '<table border="1">';
$tabela .= '<tr>';
$tabela .= '<td colspan="2">Tabela de E-mails</tr>';
$tabela .= '</tr>';
$tabela .= '<tr>';
$tabela .= '<td><b>Nome</b></td>';
$tabela .= '<td><b>Email</b></td>';
$tabela .= '</tr>';

// Puxando dados do Banco de dados
$resultado = mysql_query('SELECT * FROM emails');

while($dados = mysql_fetch_array($resultado))
 {
  $tabela .= '<tr>';
  $tabela .= '<td>'.$dados['nome'].'</td>';
  $tabela .= '<td>'.$dados['email'].'</td>';
  $tabela .= '</tr>';
 }

$tabela .= '</table>';

// Força o Download do Arquivo Gerado
 header ('Cache-Control: no-cache, must-revalidate');
 header ('Pragma: no-cache');
 header('Content-Type: application/x-msexcel');
 header ("Content-Disposition: attachment; filename=\"{$arquivo}\"");
echo $tabela;
?>

O próprio código já esta bem comentado, mas em caso de dúvida comentem.

Veja também como Importando Dados do Excel para MySQL com PHP.


"Esta dica te ajudou de alguma forma?" Então ajude outras pessoas compartilhando este conteúdo com seus amigos! =)


Até a próxima.

Comentários

Sua foto do perfil

Mauro

Funciona perfeitamente. Apenas gostaria de saber como formatar corretamente, na transcrição para o Excel, uma informação registrada em campo varchar no BD (Mysql) como fração.
Na planilha gerada, tentei formatar, sem sucesso, como texto a coluna que recebe esse valor.
Exemplo: no BD tenho o varchar 5/8. Na planilha gerada aparece 05/ago. Ao tentar formatar a coluna como texto, obtenho 42587.

05 de Fevereiro de 2016 - 21:43

Sua foto do perfil

Mauricio Programador

Olá Mauro,

Na verdade se você quer salvar no seu banco de dados uma fração deve usar o float e não Varchar.

Como você esta com varchar vai ter que converter este dado antes de enviar para o Excel.

Para converter use:

$valor_float = floatval ($variavel);

Abraço.

19 de Fevereiro de 2016 - 14:41

Sua foto do perfil

Raphael Higashi Silva

Alguém sabe como formatar o excel gerado?

05 de Fevereiro de 2016 - 15:23

Sua foto do perfil

Mauricio Programador

Olá Raphael,

o PHP não tem acesso a todos os recursos que se usássemos o Excel diretamente teríamos a disposição.

Eu realmente nunca precisei fazer este tipo de operação, mas após a sua pergunta pesquisei e não encontrei nada.

Se encontrar algo compartilhe conosco.

Abraço.

05 de Fevereiro de 2016 - 15:37

Sua foto do perfil

Mudjau

Muito obrigado! Funcionou perfeitamente. Saudações

28 de Janeiro de 2016 - 09:26

Sua foto do perfil

Alexandre Possebon

Caramba amigo voce manja muuuito... a minha duvida é:
eu gostaria de inserir a quebra de linha dentro da mesma celula.

dentro da celula A1

$nome $sobrenome <br>
$endereço <br>
$telefone

23 de Outubro de 2015 - 19:46

Sua foto do perfil

Mauricio Programador

Olá Alexandre,

Na verdade eu nunca fiz este teste com o br, mas acredito que não va da certo pois não e este comando que o Excel usa para quebrar linhas dentro das células.

Mas se achar uma solução e quiser compartilhar com nós fica a vontade.

Abraço.

30 de Outubro de 2015 - 14:21

Sua foto do perfil

Luan

Fala campeão, tudo certo? Primeiramente, parabéns pelo site.
"Segundamente" gostaria de saber se é possível anexar o arquivo "attachment" com o PHPMailer, sem ter que salvar ele temp no servidor... Tentei enviar só o $tabela, mas ficou muito zoado, e não tenho como salvar ele pelo e-mail como um xls, ai só fica a tabela mesmo se envio usando o suporte HTML do Mailer. Se possível, dá um help ai, preferência por e-mail =D

11 de Julho de 2015 - 23:57

Sua foto do perfil

Mauricio Programador

Olá Luan,

Obrigado pelo reconhecimento.

Bom primeiro você terá que criar este arquivo físico no seu servidor, para isso pode usar o post que indico abaixo:

http://www.mauricioprogramador.com.br/posts/como-criar-arquivos-com-php

Depois disso pasta usar o comando do phpmailer para anexar com o caminho do arquivo:

$mail->AddAttachment("CAMINHO E NOME DO ARQUIVO");

Prontinho.

Abraço.

13 de Julho de 2015 - 11:33

Sua foto do perfil

Herbert Resende Freitas

Belo trabalho.
Preciso de uma ajuda, não queria forçar o download, queria criar o arquivo xls e criar um link ou botão para que se o usuário quiser, ai sim ele baixaria o xls gerado.
Tem como?
Valeu amigo.

25 de Maio de 2015 - 10:54

Sua foto do perfil

Mauricio Programador

Olá Herbert,

Se aceitar uma sugestão, crie apenas o link então, e quando o usuário clicar no click ele vai para pagina que faz o cvs e baixa o arquivo, assim você vai otimizar processamento em seu servidor.

E se precisar mostrar os dados para o usuário antes dele clicar no link, apenas exiba a tabela com a consulta.

Abraço.

01 de Junho de 2015 - 09:12

Sua foto do perfil

Danilo Tessitore

Boa tarde eu gostaria de montar um .CSV com duas colunas.

<?php
// Descreve o caminho e nome do arquivo .CSV a ser gerado ou atualizado
$file_path = 'emails.csv';
// Cria uma variável dados com valor null
$dados = '';
// Informa os dados da primeira linha (cabeçalho) do arquivo .CSV a ser gerado
$dados .= 'EMAIL';
$dados .="\n";
// Recebe e armazena na variável "dados" todos os Valores a constar no arquivo (o é necessário para quebrar a linha)
$dados .= "email1@dominiodoemail.com";
$dados .= "\n";
$dados .= "email2@dominiodoemail.com";
$dados .= "\n";
$dados .= "email3@dominiodoemail.com";
$dados .= "\n";
$dados .= "email4@dominiodoemail.com";
$dados .= "\n";
// Criamos uma tabela HTML com o formato da planilha para excel
$tabela = '<table border="1">';
$tabela .= '<tr>';
$tabela .= '<td colspan="2">Tabela de E-mails</tr>';
$tabela .= '</tr>';
$tabela .= '<tr>';
$tabela .= '<td><b>Nome</b></td>';
$tabela .= '<td><b>Email</b></td>';
$tabela .= '</tr>';
// Verifica se vc tem permissão de leitura e escrita neste diretorio
if (fwrite($file = fopen($file_path, 'w+'), $dados)) {
while (!feof($file)) {
$tabela .= '<tr>';
$tabela .= '<td>' . $dados['nome'] . '</td>';
$tabela .= '<td>' . $dados['email'] . '</td>';
$tabela .= '</tr>';
}
$tabela .= '</table>';
fclose($file);
echo "Arquivo gravado com sucesso!";
?>
<!-- Cria um link para download do arquivo -->
<a href="emails.csv">Clique aqui para realizar o download do arquivo .CSV</a>
<?php
} else {
echo "Problemas ao gerar o arquivo, tente novamente!";
}
?>

20 de Maio de 2015 - 14:29

Sua foto do perfil

Mauricio Programador

Olá Danilo,

Deu erro? Qual o erro?

Abraço.

21 de Maio de 2015 - 09:52

Sua foto do perfil

Cléber Balota

Maurício, excelente artigo.
Simulei e ocorre erro ao abrir o excel, o excel gera um alerta que nao encontrou o css, acredito que seja pelo código que coloquei logo após (abaixo). No excel aparece o html que vem após o <body>.

O que devo fazer para permanecer na própria página. Ao redireciinar não abre o download,

<?php
require 'database.php';

if ( !empty($_POST)) {
// Nome do Arquivo do Excel que será gerado
$arquivo = 'usuario.xls';
echo $arquivo;

// delete data
$pdo = Database::connect();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT sig_user, nome FROM USUARIO order by sig_user";
$q = $pdo->prepare($sql);
$q->execute();

// Criamos uma tabela HTML com o formato da planilha para excel
$tabela = '<table border="1">';
$tabela .= '<tr>';
$tabela .= '<td colspan="2">Usuarios</tr>';
$tabela .= '</tr>';
$tabela .= '<tr>';
$tabela .= '<td><b>Login</b></td>';
$tabela .= '<td><b>Nome</b></td>';
$tabela .= '</tr>';

// Puxando dados do Banco de dados
while($dados = $q->fetch( PDO::FETCH_ASSOC ))
{
$tabela .= '<tr>';
$tabela .= '<td>'.$dados['sig_user'].'</td>';
$tabela .= '<td>'.$dados['nome'].'</td>';
$tabela .= '</tr>';
}
$tabela .= '</table>';
Database::disconnect();

// Força o Download do Arquivo Gerado
header ('Cache-Control: no-cache, must-revalidate');
header ('Pragma: no-cache');
header('Content-Type: application/x-msexcel');
header ("Content-Disposition: attachment; filename=\"{$arquivo}\"");
echo $tabela;
header("Content-Type: text/html;charset=ISO-8859-1");
//header("Location: index.php");
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<link href="css/bootstrap.min.css" rel="stylesheet">
<script src="js/bootstrap.min.js"></script>
</head>

<body>

16 de Abril de 2015 - 00:37

Sua foto do perfil

Mauricio Programador

Olá Cléber,

Você deve fazer a parte de exportar em uma pagina separado do seu HTML.

Abraço.

16 de Abril de 2015 - 09:11

Sua foto do perfil

almir

como eu faço para criar 2 planilhas ou duas abas

26 de Março de 2015 - 17:22

Sua foto do perfil

Mauricio Programador

Olá Almir,

o PHP não tem acesso a todos os recursos que se usássemos o Excel diretamente teríamos a disposição.

Eu realmente nunca precisei fazer este tipo de operação, mas após a sua pergunta pesquisei e não encontrei nada.

Se encontrar algo compartilhe conosco.

Abraço.

27 de Março de 2015 - 11:01

Sua foto do perfil

Almir

Mauricio tem como colocar imagem nesta planilha?

31 de Março de 2015 - 10:05

Sua foto do perfil

Mauricio Programador

Almir,

Como lhe falei acima, o PHP não tem acesso a todos os recursos.

Se encontrar algo me avise, post ai para nos.

Abraço.

31 de Março de 2015 - 10:06

Sua foto do perfil

CARLOS HENRIQUE MENDES

PARABÉNS PELO SITE.

SOU INICIANTE EM PHP E SUAS DICAS E EXPLICAÇÕES TEM AJUDADO MUITO! OBRIGADO!

19 de Março de 2015 - 10:52

Sua foto do perfil

Jeferson

Amigo muito bom e funcionou perfeitamente aqui no meu localhost, quando fiz o Upeload para o server o mesmo dá erro, vou colar o erro aqui e ver se pode me ajudar. Desde já agradeço.


Warning: Cannot modify header information - headers already sent by (output started at /home/compart/public_html/adm/exporta_lista.php:1) in /home/compart/public_html/adm/exporta_lista.php on line 77

tem mais linha, vou colar aqui para ver quais as linhas.. São 4 linhas

?header ('Cache-Control: no-cache, must-revalidate');
?header ('Pragma: no-cache');
?header('Content-Type: application/x-msexcel');
?header ("Content-Disposition: attachment; filename=\"{$arquivo}\"");


São essas as linhas, já entrei em contato com o suporte do servidor e me falaram que está tudo certinho lá. Se puder me mande um e-mail respondendo. Obrigado mais uma vez.

18 de Março de 2015 - 21:13

Sua foto do perfil

Mauricio Programador

Olá Jeferson,

Duas coisas que você pode testar para ver se o erro continua.

Primeira: Quando usamos este comando de header para fazer download, ele não pode conter nenhuma saída de texto antes do header, verifique se existe alguma.

Segundo: Se localmente este funcionando o bom seria testar em outro host que não seja este seu atual e confirmar realmente se não e problema dentro do host de hospedagem.

Testa ai, qualquer coisa da um retorno.

Abraço.

19 de Março de 2015 - 09:22

Sua foto do perfil

CARLOS HENRIQUE MENDES

PARABÉNS PELO SITE.

SOU INICIANTE EM PHP E SUAS DICAS E EXPLICAÇÕES TEM AJUDADO MUITO! OBRIGADO!

18 de Março de 2015 - 10:22

Sua foto do perfil

Jeferson Machia

Cara foi muito bom seu código, perfeitinho, só quando vou abrir o arquivo em .xls ele da uma mensagem de incompatibilidade, mas logo em seguida eu clicando em sim, ele vai na boa sem problemas... Valeu mesmo cara... Abração

11 de Março de 2015 - 12:15

Sua foto do perfil

Edimilson Corrêa Duarte

Muito Bom cara Parabéns, o que eu tinha feito, contava as linhas mas aparecia tudo em branco... eu troquei pro teu codigo, apenas alterando a forma de conexão e a query e funcionou perfeitamente. vai me quebrar um galhão. obrigado!

08 de Março de 2015 - 04:10

Sua foto do perfil

Rodolpho Netto

O meu também funcionou mas uma coluna de nome "Endereço" sai como "Endereço" no excel.

09 de Janeiro de 2015 - 09:20

Sua foto do perfil

Mauricio Programador

Olá Rodolpho,

Basta você ajustar a codificação de caracteres que ele irá escrever certo.

Teste um desses dois comandos: utf8_encode, utf8_decode

Vai resolver o problema.

Abraço.

12 de Janeiro de 2015 - 10:21

Sua foto do perfil

Danilo

Olá Mauricio,

Seu site é bem interessante e este post sobre excel me foi bem útil.
O que acontece é que as outras células ficam em branco, apenas as células onde o os dados da tabela são exibidas possuem linhas verticais e horizontais, sabe o que é ?

16 de Novembro de 2014 - 20:07

Sua foto do perfil

Mauricio Programador

Olá Danilo,

De um echo na variável $tabela e verifique se o resultado vindo do banco de dados esta sendo gerado de forma correta.

Abraço.

17 de Novembro de 2014 - 08:52

Sua foto do perfil

Danilo

Ola Mauricio obrigado pela atenção,

Os dados vem corretamento do banco, o problema ocorre no restante da tabela, no espaço da tabela onde não tem dados, também não tem células aparece como se fosse um arquivo word.

21 de Novembro de 2014 - 08:50

Sua foto do perfil

Mauricio Programador

Danilo,

Posta o seu código e a sua tabela ai para eu ver.

Abraço.

21 de Novembro de 2014 - 08:51

Sua foto do perfil

danilo

olá Mauricio mandei um email com o código e tabela.

25 de Novembro de 2014 - 08:56

Sua foto do perfil

Regis

Parabéns, acabei de usar ;)

23 de Outubro de 2014 - 10:39

Sua foto do perfil

Patrick Gomes

Mauricio, a exportação ficou bem clara, porem você saberia exportar e exibir um gráfico de linha?

19 de Outubro de 2014 - 18:06

Sua foto do perfil

Mauricio Programador

Olá Patrick,

Tem como criar sim gráficos em PHP.

Vou criar um post mostrando como se faz.

Abraço.

20 de Outubro de 2014 - 10:42

Sua foto do perfil

Bruno

Muito bom o conteúdo deste artigo e também do site.
Obrigado e Parabéns!

13 de Outubro de 2014 - 10:24

Sua foto do perfil

Marcus Barbosa

Muito obrigado me ajudou bastante

09 de Agosto de 2014 - 09:21

Sua foto do perfil

Altair Antonio

Muito bom o código, testei aqui e funcionou, agora eu tive um problema com a codificação, não sei se é porque eu utilizo o Libre Office e não o MS Office. Estou usando codificação UTF-8 no BD e no código PHP, ao exportar a acentuação deu pau.

Alguma dica?

18 de Maio de 2014 - 11:46

Sua foto do perfil

Mauricio Programador

Olá Altair,

tente usar assim:

utf8_encode($dados['nome']);

Deve resolver o problema.

Abraço.

19 de Maio de 2014 - 10:11

Sua foto do perfil

Fabrício Schunemann

Muito bom Maurício. Obrigado pelo post.
Para somar, eu consegui refinar um pouco mais a construção da tabela, sendo possível exportar os títulos das colunas para que apareçam em negrito, deixando a parte da tabela referente ao título das colunas entre as tags <thead> e </thead> e o corpo corpo da tabela entre as tags <tbody> e </tbody>.

19 de Abril de 2014 - 14:00

Sua foto do perfil

MARCELO BRANCO

Maurição, muito bom. Simples e objetivo. Parabéns pelo seu site.

Abração.

02 de Abril de 2014 - 18:02

NEWSLETTER

Receba dicas de programação
em seu e-mail

TWITTER

Acompanhe tudo o que rola
com Mauricio Programador

NEWSLETTER