Jump to content
Sign in to follow this  
snis

excel to mysql

Recommended Posts

snis

olá a todos

Necessito inserir dados do excel para dentro de uma tabela excel, embora só adiciona casa ainda não exista.

Imagine-se que tenho a tabela clientes, e mensalmente necessito atualizar a minha base dados com um ficheiro xlsx ou xls

Se o cliente já existir tudo bem, senão adiciona à tabela cliente.

Qual seria a melhor opção? validar em php se existe ou passar tudo para uma tabela temporaria e depois validar entre 2 tabelas mysql?

Para além disso, já tenho código php que me le o ficheiro e insere na tabela temp, mas se o ficheiro foi grande(o que necessito tem cerca de 10mb) da erro de php (Warning

: POST Content-Length of 10409552 bytes exceeds the limit of 8388608 bytes in

Unknown

on line

0) ou passa 30s (Fatal error

: Maximum execution time of 30 seconds exceeded in

C:\xampp\htdocs\xxx\xx\Classes\PHPExcel\Reader\Excel2007.php

on line

933)

estou usar phpExcel e deixo aqui o código que funciona com pequenos ficheiros

<html>
<head>

</head>
<body>
<div style="border:1px dashed #333333; width:1000px; margin:0 auto; padding:10px;">
<form name="import" method="post" enctype="multipart/form-data">
 <input type="file" name="file" id="file" multiple />
 <input type="submit" name="submit" value="Submit" />
</form>
<?php
include ("connection.php");
require '/Classes/PHPExcel.php';
require_once '/Classes/PHPExcel/IOFactory.php';
if(isset($_POST["submit"]))
{
$path = $_FILES['file']['tmp_name'];

 $objPHPExcel = PHPExcel_IOFactory::load($path);
 foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
	 set_time_limit(200);
	 $worksheetTitle	 = $worksheet->getTitle();
	 $highestRow		 = $worksheet->getHighestRow(); // e.g. 10
	 $highestColumn	 = $worksheet->getHighestColumn(); // e.g 'F'
	 $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
	 $nrColumns = ord($highestColumn) - 64;


	 for ($row = 1; $row <= $highestRow; ++ $row) {

		 $val=array();

		 for ($col = 0; $col <= $highestColumnIndex; ++ $col) {
			 $cell = $worksheet->getCellByColumnAndRow($col, $row);
			 $val[] = $cell->getValue();


		 }

		 $sql="insert into csv (name, email)values('".$val[0] . "','" . $val[1] . "')";
		 $result=mysql_query($sql);


	 }

 }



}
?>
</div>

</body>
</html>

Edited by apocsantos
geshi

Share this post


Link to post
Share on other sites
Cerzedelo

Quanto ao tamanho do ficheiro, deve alterar no ficheiro php.ini, a propriedade max_upload_filesize para um valor superior ao tamanho do ficheiro.

Ver: http://stackoverflow.com/questions/2184513/php-change-the-maximum-upload-file-size

Outra questão se a tabela que insere todos os meses, contiver todos os nomes de todos os clientes, mas vale fazer reset a tabela e inserir os dados como se fosse a 1ª vez, se só acrescenta nomes, ai terá de fazer a validação, mas para isso, o melhor seria arranjar um campo com um valor único por cliente, tipo um id, ou nif, porque validar pelo nome, não será o mais correcto, na medida que pode existir 2 nomes iguais.

Share this post


Link to post
Share on other sites
snis

Olá

desde já agradeço a tua ajuda Cerzedelo

Relativamento ao tamanho já resolvi.

Essa tabela de clientes contem clientes de varios tipos. Cada folha excel é um tipo. E cada cliente tem um id unico.

A questão é: valido o cliente ao abrir o excel ou depois entre 2 tabelas ?

Já agora , estou com outro problema.

Com ficheiros maiores, depois de carregar o ficheiro e fazer submit no form, fica aguardar localhost no browser. Se o ficheiro for grande, expira o tempo e dá erro:

Esta página Web não está disponível

ERR_CONNECTION_RESET

Ocultar detalhes

A ligação a localhost foi interrompida.

Atualizar esta página Web

Prima o botão de atualização para enviar novamente os dados necessários para carregar a página.

Verificar a ligação à Internet

Verifique os cabos e reinicie todos os routers, modems ou outros dispositivos de rede que possa estar a utilizar.

Permita que o Chrome aceda à rede nas definições da sua firewall ou antivírus.

Se já estiver indicado na lista como sendo um programa com permissão para aceder à rede, tente removê-lo da lista e adicioná-lo novamente.

Se utilizar um servidor de proxy...

Verifique as definições de proxy ou contacte o administrador de rede para se certificar de que o servidor de proxy está a funcionar. Se acha que não deve utilizar um servidor proxy: Aceda ao menu Chrome > Definições > Mostrar definições avançadas... > Alterar definições de proxy... > Definições de LAN e desmarque "Utilizar um servidor proxy para a rede local".

Share this post


Link to post
Share on other sites
Knot

Aumenta o tempo por exemplo para 1 minuto no inicio do php set_time_limit(60):

http://php.net/manual/en/function.set-time-limit.php

Eu ando a desenvolver um trabalho que envolve 2 bases de dados e tenho feito a verificação da existência de dados com recurso a tabela temporária e tem funcionado muito bem e sem grandes dores de cabeça, mas cada caso é um caso...

Edited by Knot

Share this post


Link to post
Share on other sites
snis

Obrigado Knot.

Já aumentei e continua dar erro..

set_time_limit(0); 0 nao tem limit

o ultimo teste durou cerca de 3 min e depois deu erro

Edited by snis

Share this post


Link to post
Share on other sites
Knot

Copia meia dúzia de dados do teu excel para outro ficheiro e testa com esse novo ficheiro, só para confirmar que o problema é a quantidade de dados ser grande. É que pode dar-se o caso de estar a haver aí algum Loop manhoso. Eu gosto de ir pondo de parte estes possíveis erros para conseguir encontrar a fonte do problema. Caso funcione bem podemos colocar de parte o problema de um possível Loop e aí vamos analisar se o set_time_limit está a ser assimilado ou não.

<?php
set_time_limit(0); //coloca aqui e testa
include ("connection.php");
require '/Classes/PHPExcel.php';
require_once '/Classes/PHPExcel/IOFactory.php';
if(isset($_POST["submit"]))
{
$path = $_FILES['file']['tmp_name'];
        $objPHPExcel = PHPExcel_IOFactory::load($path);
        foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
               set_time_limit(0);//coloca aqui e testa

Edited by Knot

Share this post


Link to post
Share on other sites
snis

desculpa a demora

estive aqui a testar , e reamente adicionando pouco a pouco, foi fazendo testes e o tamanha não me parece que seja o problema...

relativamente ao set_time_limit(0); coloquei a primeira opção e melhorou bastante. no ficheiro original ainda da erro, mas em copia com alguns(quase todos) os registos nao deu problema.

Share this post


Link to post
Share on other sites
Knot

Dizes que com quase todos os registos não dá problema, será que não há aí algum registo manhoso? Tipo copia a primeira metade dos dados e testa e depois copia a segunda metade dos dados e testa. Se alguma das metades (ou podes dividir em partes mais pequenas) der problemas poderás ter aí algum registo com alguma falha. Isto é apenas uma ideia, até pode estar tudo bem com os registos, é só mesmo para meter de parte essa possibilidade.

Podes também testar isto:

ini_set('max_execution_time', 300);

Edited by Knot

Share this post


Link to post
Share on other sites
snis

Realmente Não entendo

Abri o ficheiro Excel e eliminei linhas vazias abaixo da última linha com registo. Guardei

O ficheiro ficou ocupar mais uns km's e a seguir começou a fazer os primeiros echos

Onde demora muito tempo é na parte de $path...

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.