Atualizado em 10 de Janeiro de 2014

Importando Dados do Excel para MySQL com PHP

Olá pessoal,

Como prometido no post anterior (Exportando Dados do MySQL para Excel com PHP) vamos ver como fazer o processo inverso de importar os dados do Excel para MySQL com PHP.

O primeiro procedimento que devemos fazer e salvar o arquivo do Excel no formato CSV (separado por vírgulas) (*.csv), como mostra a imagem abaixo:

Importando Dados do Excel para MySQL com PHP

É necessário fazer este procedimento para que o PHP leia as informações do arquivo para salvar os dados no Banco de Dados.

Depois basta usar o script abaixo:

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

// Abre o Arquvio no Modo r (para leitura)
$arquivo = fopen ('dados_emails.csv', 'r');

// Lê o conteúdo do arquivo
while(!feof($arquivo))
 {
  // Pega os dados da linha
  $linha = fgets($arquivo, 1024);

  // Divide as Informações das celular para poder salvar
  $dados = explode(';', $linha);

  // Verifica se o Dados Não é o cabeçalho ou não esta em branco
  if($dados[0] != 'Nome' && !empty($linha))
  {
   mysql_query('INSERT INTO emails (nome, email) VALUES ("'.$dados[0].'", "'.$dados[1].'")');
  }
 }

// Fecha arquivo aberto
 fclose($arquivo);
?>

A imagem abaixo mostra como ficou o banco de dados após a execução do mesmo:

Banco de Dados após execução do script


Curta a nossa página



E isso aí pessoal, até a próxima.


ATENÇÃO! Quer aprender a Linguagem mais usada pelos programadores na Web Passo a passo por apenas R$99,00??? Faça agora a sua matrícula no Curso de PHP Básico. Saiba mais

Comentários

Sua foto do perfil

WALLACE SANTOS RAIMUNDO

Mauricio eu fiz igual o teu, porque ele fica repetindo o loop ??
fica repetindo as linhas..
Não tem como eu ler o arquivo, armazenar tudo em uma unica variavel ?? e dps dar o explode ?

15 de Fevereiro de 2016 - 21:41

Sua foto do perfil

Mauricio Programador

Olá Wallace,

Ele vai repetir o loop ate o final da planilha, se você criar uma planilha grande ele irá fazer um loop maior.

Veja se o seu código esta igual, pois eu testei aqui novamente e esta tudo ok.

Abraço.

19 de Fevereiro de 2016 - 15:00

Sua foto do perfil

Mauro Garcia

Bom dia, Mauricio e o CSS excell_reader_2. ele permite a importação de arquivos em excell até 2003, formato xls. Estamos atras de um css para xlxs. Abraços e parabens pelo blog.

21 de Janeiro de 2016 - 11:54

Sua foto do perfil

Mauricio Programador

Olá Mauro,

não sei de nenhuma extensão que você possa usar com o xlxs.

Abraço.

25 de Janeiro de 2016 - 14:56

Sua foto do perfil

welleson

parabens mauricio, obrigado por ajudar.
poderia mostrar como armazenar arquivos como o pdf jpg no banco, desde ja obrigado

20 de Janeiro de 2016 - 11:12

Sua foto do perfil

Mauricio Programador

Olá Welleson,

Vou criar um post com este tema.

Abraço.

25 de Janeiro de 2016 - 14:53

Sua foto do perfil

Guilherme

Olá,

Eu tenho um sistema de Login em que eu preciso pegar uma informação especifica de uma coluna e linha de uma planilha do Excel, tenho procurado informações, video-aulas, dicas etc de como fazer isso.

Eu utilizei esse código e modifiquei para tentar recuperar essas informações, entretanto não tenho sucesso.

Pode me auxiliar?

Obrigado pela atenção.

28 de Agosto de 2015 - 11:27

Sua foto do perfil

Mauricio Programador

Olá Guilherme,

Claro, mas sabendo os nomes das colunas basta criar um IF ou Switch para pegar a coluna que desejar.

Mas posta ai a sua dúvida.

Abraço.

04 de Setembro de 2015 - 11:01

Sua foto do perfil

Kaio

Muito obrigado, me ajudou muito.

13 de Agosto de 2015 - 09:27

Sua foto do perfil

Alexandre Ramos

Maurício Boa noite.

Estou tentando utilizar o script mais vem apresentando um erro no mysql pode me ajudar, segue erro:

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'real,orig,dest,dif,parado,tempo_prev,tempo_real,tempo_dif,cvg,veiculo,documento,' at line 1,

Pode me ajudar por favor?

11 de Agosto de 2015 - 20:49

Sua foto do perfil

Mauricio Programador

Olá Alexandre,

O erro que esta apresentando é no SQL do banco de dados e como não tenho o banco de dados que você esta usando e nem os arquivos não tenho muito como ajudar.

Mas faz o seguinte teste de um echo ou print no seu SQL que esta mandando para a função mysql_query e pegue a string que ele vai lhe mostrar e coloque no seu administrador do banco de dados, seja ele phpMyAdmin ou o que estiver usando então ele vai me lhe mostrar uma mensagem de erro que vai facilitar para ajustar o erro.

Abraço

17 de Agosto de 2015 - 10:25

Sua foto do perfil

Ricardo

Primeiro queria dar os parabéns pelo post, estou fazendo um sistema que necessita importar dados do Excel, o usuário iria selecionar o arquivo e importar. Como ficaria este comando para o usuário selecionar e importar este arquivo?

05 de Agosto de 2015 - 21:18

Sua foto do perfil

Mauricio Programador

Olá Ricardo,

Obrigado.

Basta fazer o um formulário de upload. O formulário precisa estar com a propriedade enctype="multipart/form-data" ativa.

E dentro do formulário você usa um campo do tipo FILE.

Com isso você vai conseguir enviar o arquivo, e depois no lugar do nome do arquivo que mostra no script assim, basta usar: $_FILES['file']['tmp_name'].

Espero que ajude.

Abraço.

10 de Agosto de 2015 - 10:09

Sua foto do perfil

Ricardo

Boa noite.

Cara desculpa minha ignorância mas sou novo na linguagem e fiz a seguinte pergunta "Primeiro queria dar os parabéns pelo post, estou fazendo um sistema que necessita importar dados do Excel, o usuário iria selecionar o arquivo e importar. Como ficaria este comando para o usuário selecionar e importar este arquivo?"
Não entendi direto sua resposta "Com isso você vai conseguir enviar o arquivo, e depois no lugar do nome do arquivo que mostra no script assim, basta usar: $_FILES['file']['tmp_name']." Se possível você poderia me explicar melhor. Obrigado pela atenção.

14 de Agosto de 2015 - 09:31

Sua foto do perfil

Mauricio Programador

Ricardo,

Aqui no comentário não teria como eu colocar todo o código para você fazer esta ação, mas vou colocar o passo a passo que você deve fazer para realizar esta operação.

1) Criar um formulário com o campo do tipo FILE, que é o campo onde o usuário pode selecionar arquivos para enviar. (Que no seu caso vai ser enviado o arquivo CVS).

2) Depois quando enviar o arquivo pelo formulário ele tem que executar o código deste post e a única alteração que vai ter que fazer no código acima seria trocar a linha:

$arquivo = fopen ('dados_emails.csv', 'r');

por:

$arquivo = fopen ($_FILES['file']['tmp_name'], 'r');

So não esqueça de colocar nas propriedade do seu formulário o parâmetro enctype="multipart/form-data"

Abraço.

14 de Agosto de 2015 - 09:32

Sua foto do perfil

Max Basilio

Ola Mauricio, eu estou com um problema na hora de importar o XLS para o MySql a data que esta no formato ex: 01/12/2004 no XLS entra como 12/01/04, queria que entrasse no nosso padrão, mas acho que tbem varia da config regional do computador, tem como me ajudar ?

27 de Julho de 2015 - 15:41

Sua foto do perfil

Mauricio Programador

Olá Max,

Se o seu banco de dados MySQL esta com o campo da Data com o tipo DATE o formato que ele espera receber é ANO-MÊS-DIA (2004-12-01).

Então quando você pegar esta informação do Excel vai ter que converter ela para ficar neste formato e assim poder salvar no banco de dados.

Abraço.

31 de Julho de 2015 - 16:54

Sua foto do perfil

Leandro

Amigo,

poderia disponibilizar o codigo do table que vc exibiu os dados importados?

Obrigado... e parabéns pelo post.

16 de Julho de 2015 - 15:08

Sua foto do perfil

Mauricio Programador

Olá Leandro,

na verdade ali e apenas uma imagem do phpMyAdmin, e a construção da tabela e bem simples tem apenas três campos.

Você fico com dúvida em algo ali?

Abraço.

20 de Julho de 2015 - 09:59

Sua foto do perfil

clayton

Maurício...meu problema é o seguinte: há situações em que o número de colunas do meu arquivo excel varia. Por exemplo: se eu tiver 3 colunas nome, telefone e e-mail...O telefone de Maria pode estar ausente e a coluna e-mail passa a ser a 2ª coluna...Nesse caso, a linha que se refere a Maria teria apenas 2 colunas na planinha..Isso acontece pq preciso copiar dados para o excel e transformar texto em colunas. Vc teria uma ideia de que como resolver isso?? obrigado!

23 de Maio de 2015 - 09:41

Sua foto do perfil

Mauricio Programador

Olá Clayton,

Geralmente este tipo de situação não e comum, pois quando fizemos a importação de dados entre arquivos e criado um padrão para que seja realizada a operação sem ter erros.

Mas se você precisar muito fazer isso você terá que fazer validações dentro do seu código.

Por exemplo:

Verifique se o conteúdo da coluna 2 é um email (Validar Email PHP), se for ele salva na campo email, se não for salva no campos telefone.

Para isso basta criar uma variável $sql por exemplo e no if que verifica se e email coloca se ele deve salvar no campo de email ou no campo de telefone.

Qualquer coisa retorne.

Abraço.

25 de Maio de 2015 - 09:50

Sua foto do perfil

Rodolfo

Muito bom mesmo.

Como poderíamos fazer para quando no momento da leitura de um número decimal contendo vírgula que a mesma fosse substituída por um ponto?

Ocorre que o MySQL trunca o valor transformando a parte decimal em zero.

16 de Maio de 2015 - 18:24

Sua foto do perfil

Mauricio Programador

Olá Rodolfo,

basta usar a função str_replace que vai resolver o problema.

Abraço.

18 de Maio de 2015 - 09:00

Sua foto do perfil

Fabio Reche

Obrigado Maurício, sua rotina me ajudou.

15 de Maio de 2015 - 16:53

Sua foto do perfil

Morales Lima

Olá, primeiramente quero agradecer pelo grande esclarecimento.

Após executar noto que no mysql aparece a seguinte mensagem:
Esta tabela não contém uma coluna exclusiva . Grade de edição, caixa de seleção, Editar, Copiar e apagar recursos não estão disponíveis .

Como habilitar o Grid edit ou já exportar com Grid edit habilitado?

14 de Maio de 2015 - 22:55

Sua foto do perfil

Mauricio Programador

Olá Morales,

Obrigado.

Na verdade o seu erro é em seu banco de dados. Ele esta informando que você não tem nenhum campos de referencia para poder fazer as operações citadas.

Verifique o seu banco de dados.

Abraço.

18 de Maio de 2015 - 08:56

Sua foto do perfil

Débora Gonçalves

Seria possível anexar arquivo cvs pelo método post de formulário?

30 de Março de 2015 - 08:21

Sua foto do perfil

Mauricio Programador

Olá Débora,

sim, basta usar o campo FILE do HTML.

Abraço.

31 de Março de 2015 - 10:10

Sua foto do perfil

Renan

Professor, seu blog tem me ajudado muito ultimamente, a maioria das duvidas que tenho, acabo solucionando por aqui. Muito bom essa importação do excel pro mysql. Testei aqui e funcionou direitinho. Parabéns, continue postando esses conteúdos de ótima qualidade. abraço.

23 de Fevereiro de 2015 - 14:12

Sua foto do perfil

Mauricio Programador

Olá Renan,

obrigado e fico feliz em ajudar.

grande abraço.

24 de Fevereiro de 2015 - 09:54

Sua foto do perfil

Renato Monfredo

Olá Mauricio, meu código nao aparece nada. Nem insere nem exibe erro. Pode me ajudar? Obrigado!

20 de Fevereiro de 2015 - 16:13

Sua foto do perfil

Mauricio Programador

Olá Renato,

o seu código esta como acima? Sua conexão com o banco de dados esta funcionando?

Abraço.

23 de Fevereiro de 2015 - 09:36

Sua foto do perfil

Renato Monfredo

Olá Maurício, sim está tudo ok. Consegui importar os dados alterando o código, porém agora quando ele importa, a primeira linha da primeira coluna aparece com um código na frente do registro, ou seja, antes do primeiro registro ele insere a codificação .
Abaixo segue meu código se puder me dar uma ajuda, por favor:

// inclui a conexao
include_once('connection.php');

$handle = fopen('lista_parceiros.csv','r');
while (($data = fgetcsv($handle,1048576, ";"))!== FALSE) {
$sql = "INSERT INTO colaboradores_parceiros (coluna1, coluna2, coluna3, coluna4, coluna5, coluna6, coluna7, coluna8, coluna9, coluna10, coluna11, coluna12, coluna13, coluna14, coluna15) VALUES ('$data[0]','$data[1]','$data[2]','$data[3]','$data[4]','$data[5]', '$data[6]','$data[7]','$data[8]','$data[9]','$data[10]','$data[11]', '$data[12]','$data[13]','$data[14]')";
mysql_query($sql)or die(mysql_error());
}
fclose($handle);

24 de Fevereiro de 2015 - 09:56

Sua foto do perfil

Mauricio Programador

Renato,

Talvez o erro agora seja apenas acentuação teste os comando utf8_encode, utf8_decode para ver se resolve.

Se não resolver poste ai.

Abraço.

24 de Fevereiro de 2015 - 09:57

Sua foto do perfil

Naldo

Valeu Mauricio! Me ajudou bastante!
O meu não estava dando certo. Alguns dados da minha planilha do excel continham caracteres especiais e barras. Para resolver eu modifiquei a linha "$dados = explode(';', $linha);" por "$dados = explode(';', (string)addslashes($linha));"
Resolvido o problema.

13 de Fevereiro de 2015 - 00:26

Sua foto do perfil

Brecha Virtual

Parabéns professor !

Mais uma vez nos ajudando e muito !

22 de Janeiro de 2015 - 16:12

Sua foto do perfil

Fernando

Opa... Como retirar a mensagem "o arquivo que você esta tentando abrir esta em um formato diferente do especificado pela extenção do arquivo..." Se eu clicar em abrir o arquivo, o exel abre normalmente, mas sempre aparece esse alerta quando abro a planilha...

19 de Dezembro de 2014 - 23:26

Sua foto do perfil

Mauricio Programador

Olá Fernando,

O que acontece e que o arquivo tem uma extensão diferente da extensão padrão do Excel, por isso ele emite esta mensagem.

Somente após salvar ele com a extensão normal do Excel a mensagem não aparecerá mais.

Abraço.

22 de Dezembro de 2014 - 08:54

Sua foto do perfil

Felipe

A EXTENSÃO DO ARQUIVO NÃO É CVS E SIM CSV (FALHA NA DIGITAÇÃO)

05 de Dezembro de 2014 - 14:18

Sua foto do perfil

Mauricio Programador

Olá Felipe,

tens toda razão, já alterei.

Obrigado.

08 de Dezembro de 2014 - 09:26

Sua foto do perfil

Félix

Parabéns! ótimo código e muito obrigado por compartilhar, mais tenho uma pergunta, existe um delimitador de caractere por linha que foi o que o Adelor da silva perguntou, estou tentando subir um arquivo com uma quantidade expressiva de linhas e ao ler o arquivo é apresentado erro, mais testando com um arquivo com 100 linhas ele importou perfeitamente, tem algum comando que libere a leitura de um arquivo.csv maior, com uma quantidade mais expressiva de linhas? desde já, Muito obrigado!

24 de Novembro de 2014 - 22:36

Sua foto do perfil

Mauricio Programador

Olá Félix,

Teria que ver qual e o erro, pois os servidores são configurados para que o script PHP rode dentro de um tempo, se ultrapassar este tempo ele da erro.

Se for este o caso, tente arrumar com a explicação do post abaixo.

Tempo de Execução do Script PHP

Abraço.

25 de Novembro de 2014 - 08:57

Sua foto do perfil

Talyta

Cara, sabe como eu faço ao importar os dados de um excel pelo php se tem como eu escolher qual aba quero ler?

20 de Outubro de 2014 - 15:49

Sua foto do perfil

Mauricio Programador

Olá Talyta,

Tirando o IF do comando acima, ele irá importar todos os dados que ele encontrar na planilha.

Abraço.

21 de Outubro de 2014 - 08:51

Sua foto do perfil

Renato

Olá, eu fiz conforme exemplo, porém roda meu php não dá retorno de nada, nem de erro nem que deu certo.

Pode me ajudar.

15 de Outubro de 2014 - 14:16

Sua foto do perfil

Mauricio Programador

Olá Renato,

Se ele não gera nenhum erro e nem insere os registros no banco de dados pode ser a linha abaixo:

if($dados[0] != 'Nome' && !empty($linha))

Ela verifica o cabeçalho e se esta vazio, então comenta este IF e testa só para ver se ele vai inserir, caso de certo você deve ver se o nome da coluna de sua planilha esta como indicado no IF.

Qualquer coisa comenta aí, abraço.

16 de Outubro de 2014 - 09:52

Sua foto do perfil

Renato

Olá, eu fiz conforme exemplo, porém roda meu php não dá retorno de nada, nem de erro nem que deu certo.

Pode me ajudar.

20 de Outubro de 2014 - 10:39

Sua foto do perfil

Mauricio Programador

Renato,

Manda para o meu e-mails os seus arquivos para eu ver.

Abraço.

20 de Outubro de 2014 - 10:39

Sua foto do perfil

ALEXANDER FERDINANDO

boa noite, tenho uma tabela que preciso importar os dados dela para o sistema php que estou "tentando" desenvolver, tentei fazer conforme o seu exemplo e não tive sucesso, poderia me ajudar?
segue a situação:

poderia me dizer aonde foi o meu erro?
abraços, otima noite

11 de Setembro de 2014 - 18:17

Sua foto do perfil

Mauricio Programador

Olá Alexander,

O sistema de comentários não aceita colocar o html todo da página, mas faz assim me envia os arquivo por email (contato[@]mauricioprogramador.com.br) que dou uma olhada para você.

So me diz qual foi o erro que deu ai.

Abraço.

12 de Setembro de 2014 - 09:59

Sua foto do perfil

Lucas de Oliveira

Boa tarde, gostaria de agradecer por esse tutorial incrível, ocorreu tudo como esperado. Fiz as alterações à forma que precisei, mas restou a dúvida de que, na minha tabela, ele está salvando o cabeçalho também, mesmo eu identificando o campo dados[0].
if(($dados[0] != 'Código') && ($linha != ''))
Gostaria se possível tirar essa dúvida contigo, já que não seria interessante isso no banco. Abraço

07 de Setembro de 2014 - 15:24

Sua foto do perfil

Mauricio Programador

Olá Lucas,

Não tem o que agradecer estamos aqui para ajudar ;)

O Problema deve estar no acento do "Código", pois em alguns casos ele não reconhece o acento ou não esta formatado.

Faça um teste de um echo na Variável $dados[0] e veja como esta vindo o texto, se tiver problema no acento só corrija que já irá funcionar.


Abraço.

08 de Setembro de 2014 - 10:41

Sua foto do perfil

Ivomar Santos

Olá Maurício, me salvou, estava buscando sobre o assunto para resolver um problema da faculdade. Poderia me mandar o SCRIPT SQL para criação da tabela? Estou iniciando com Banco de Dados ainda e fico meio no ar. Grato! Bom Tutorial.

02 de Setembro de 2014 - 11:04

Sua foto do perfil

Mauricio Programador

Olá Ivomar,

Obrigado pela palavras.

Neste post abordei somente a Importação, mas para criar a Tabela o script seria:

CREATE TABLE IF NOT EXISTS `emails` (
`idemail` int(11) NOT NULL,
`nome` varchar(70) NOT NULL,
`email` varchar(150) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Abraço.

02 de Setembro de 2014 - 16:38

Sua foto do perfil

AIRTON

obrigado por compartilhar essa informação, rodou perfeitamente, grato!

21 de Agosto de 2014 - 12:11

Sua foto do perfil

Everton

Boa tarde Mauricio, tenho que fazer algo parecido, gostaria de tirar algumas dúvidas, preciso fazer a importação 1 vez por mês, então é preciso substituir os dados existentes no banco então como ficaria essa sql, e outra coisa minha planilha tem 120 colunas... tenho que repetir no insert todos os 117 campos ? abraço obrigado !

05 de Agosto de 2014 - 15:43

Sua foto do perfil

Mauricio Programador

Olá Everton,

Bom para fazer a substituição você terá que verificar se os dados já estão no banco de dados, se tiver ele atualiza, se não tiver ele insere.

Não entendi muito bem quanto as 120 colunas.

Abraço.

06 de Agosto de 2014 - 11:44

Sua foto do perfil

Wandreus

Olá o meu funcionou mais ele insere mais de 1000 linhas em branco sem valor nenhum..
isso é um problema pra mim por que vou chamar os dados dessa tabela em outra página então ele vai contar os campos vazios por causa do ID que ele Gera me ajude por favor..

19 de Maio de 2014 - 08:26

Sua foto do perfil

Mauricio Programador

Olá Wandreus,

Este script ja tem um verificador (if($dados[0] != 'Nome'...) para não cadastrar quando o valor for vazio, porém se esta linha não esta funcionando tente mudar esta linha para:

if(($dados[0] != 'Nome') && ($linha != ''))

Se não adiantar, posta ai.

Abraço.

19 de Maio de 2014 - 10:15

Sua foto do perfil

vieira

Deu um erro no $dados

04 de Maio de 2014 - 23:23

Sua foto do perfil

Mauricio Programador

Olá Vieira,

qual erro? Seu arquivo de conexão esta certinho?

Fico no aguardo.

05 de Maio de 2014 - 09:03

Sua foto do perfil

VIEIRA

O erro foi esse aqui:
Parse error: syntax error, unexpected '$dados' (T_VARIABLE) in C:\wamp\www\BD_Santino\subir.php on line 17

obrigado

14 de Maio de 2014 - 12:48

Sua foto do perfil

VIEIRA

Na verdade esse erro T_STRING deu na query do sql. Não consigo resolver.

Se puder ajudar, agradeço muito.

14 de Maio de 2014 - 12:51

Sua foto do perfil

Mauricio Programador

Olá Vieira,

coloca todo o seu script para eu poder analisar.

Abraço.

14 de Maio de 2014 - 12:52

Sua foto do perfil

Paulo

Amigo.. vc tem a importação de arquivos no formato xls?

26 de Março de 2014 - 16:16

Sua foto do perfil

Mauricio Programador

Olá Paulo,

de uma olhada para ver se e isso que você precisa.

Exportando Dados do MySQL para Excel com PHP

Abraço.

26 de Março de 2014 - 16:24

Sua foto do perfil

Adelor da Silva

Muito obrigado por compartilhar essa informação! Ficamos gratos!

Mas restou uma dúvida! O que é o número 1024

$linha = fgets($arquivo, 1024);

14 de Março de 2014 - 14:39

Sua foto do perfil

Mauricio Programador

Olá Adelor,

este parâmetro e o que diz o comprimento máximo que o comando vai ler por linha do arquivo. Se nenhum comprimento for especificado, a leitura continuará até chegar ao final da linha.

E mais para otimizar o código quando sabemos + ou - o tamanho da linha.


Grande abraço.

14 de Março de 2014 - 15:30

NEWSLETTER

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

TWITTER

Acompanhe tudo o que rola
com Mauricio Programador

NEWSLETTER