importar registros de uma planilha excell

Prezados, como faço para importar dados de uma planilha excell no SC ?

salva ela como csv.

com fopen eh tranquilo a importação.

Ok…tem como me passar um tuto de responsa…
só to achando coisa tosca na net…

Jean,

1 - Cria uma app Controle;
2 - Crie um campo com o nome ARQUIVO, por exemplo. Ele deve ser um campo do tipo DOCUMENTO (NOME DE ARQUIVO);
3 - No evento OnValidate coloque o teu código. Posto o que fiz aqui pra importar uma planilha Excel, pra te servir de exemplo.

// Pegando o arquivo com caminho
$caminho = $this->Ini->path_doc;
$arq = $caminho.'/'.{arquivo};

// Processando a leitura
$fp = fopen($arq,'r');

// Pegando a primeira linha (cabeçalho)
$linha = fgets($fp);

// Pegando o caracter separador na coluna 12
$caracter = substr($linha,12,1);

// Processando arquivo
while ($dados = fgetcsv($fp, filesize($arq), $caracter))  
    $tabela[] = $dados; 
 
fclose($fp);

$insert_sql = 'INSERT INTO tab_lojas ('
             .'nome_loj,endereco,bairro,cidade,uf_loja,cep,fone,fax,email,'
	         .'gerente,dat_inicial,situacao,dat_inativa,codempresa) VALUES';

foreach ($tabela as $campo) 
{
  if (empty($campo[1])) {
     break;
  }
  $check_sql = 'SELECT * FROM tab_lojas '
             . ' WHERE nome_loj = "'.$campo[0].' - '.$campo[1].'"';
  sc_select(dataset, $check_sql);
  if (false == {dataset})     // Error while accessing database
  {
     sc_error_message('Erro durante acesso ao TAB_LOJAS.');
  }
  elseif (!{dataset}->EOF)   // Existe na tabela
  {
     continue;
  }
  elseif ({dataset}->EOF)   // Não existe na tabela
  {
     $nome_loj = $campo[0]." - ".$campo[1];
     $endereco = '';
     $bairro = '';
     $cidade = $campo[3];
     $uf_loja = $campo[2];
     $cep = '';
     $fone = '';
     $fax = '';
     $email = '';
     $gerente = '';
     $dat_inicial = '0000-00-00';
     $situacao = 0;
     $dat_inativa = '0000-00-00';	 
	 $cod_empresa = 1;
	 
	    // Monta a parte de inserção dos campos
     $insert_sql2 = " ('".$nome_loj."','".$endereco."','".$bairro."','".$cidade."','".$uf_loja."','".$cep."',";
     $insert_sql2 .= "'".$fone."','".$fax."','".$email."','".$gerente."','".$dat_inicial."',".$situacao.",";
     $insert_sql2 .= "'".$dat_inativa."',".$cod_empresa."),";
     $insert_sql .= $insert_sql2;
  }
}	
if (empty($insert_sql2)) {
   sc_error_message("Não há registros a atualizar, verifique");
}
else {
// Tira o último caractere (vírgula extra)
   $insert_sql = substr($insert_sql, 0, -1);

// Inserir registros
   sc_exec_sql($insert_sql);

// Pega o número de registros inseridos
   $cadastrados = mysql_affected_rows();
   sc_error_message("Lojas cadastradas: " . $cadastrados);
}

Espero ter ajudado.

2 Curtidas

Obrigado Kleyber…vou implementar aqui…

Kleyber,

Este exemplo serve para importar arquivos xml?
Estou precisando importar um arquivo xml de um sistema que emite exames ECG.

Aguardo retorno e obrigada.

Adriana,

Creio que não, pois um arquivo XML teria que ser lido pelas tags. Veja este link aqui, talvez dê uma clareada ao que queres fazer:
http://blog.clares.com.br/ler-xml-com-php/

Abraços,

Boa tarde!

Kleyber, obrigado pelo código, me serviu perfeitamente, apenas fiz algumas alterações para o usuário poder informar quais campos ele quer importar de acordo com o CSV.

Vou disponibilizar o código e uma print caso alguém precise futuramente.

No OnValidate ficou o código abaixo:

if({arquivo} == ''){
	sc_error_message('Arquivo não selecionado');
}else{

	// Pegando o arquivo com caminho
	$caminho = $this->Ini->path_doc;
	$arq = $caminho.'/'.{arquivo};


	// Processando a leitura
	$fp = fopen($arq,'r');


	// CABECALHO
	$cabecalho = fgets($fp);
	$cabecalho = substr($cabecalho, 0, -2); // remove caracteres especiais finais


	// Processando arquivo
	while ($dados_csv = fgetcsv($fp, filesize($arq))){
		$dados[] = $dados_csv; 
	}
	fclose($fp);


	//VALIDA CAMPOS FORMULARIO X CSV
	$_cab_explode = explode(';', $cabecalho);

	if(!in_array({cabecalho1},$_cab_explode)){
		sc_error_message('Cabeçalho 1 não existe no arquivo CSV');
	}if(!in_array({cabecalho2},$_cab_explode) && {cabecalho2} != "") {
		sc_error_message('Cabeçalho 2 não existe no arquivo CSV');
	}if(!in_array({cabecalho3},$_cab_explode) && {cabecalho3} != ""){
		sc_error_message('Cabeçalho 3 não existe no arquivo CSV');
	}if(!in_array({cabecalho4},$_cab_explode) && {cabecalho4} != ""){
		sc_error_message('Cabeçalho 4 não existe no arquivo CSV');
	}if(!in_array({cabecalho5},$_cab_explode) && {cabecalho5} != ""){
		sc_error_message('Cabeçalho 5 não existe no arquivo CSV');
	}


	//INSERÇÃO
	//campos
	$_sql_insert_cab = "INSERT INTO clientes( ";
	$_sql_insert_cab .= '`'.{campo1}.'`,';
	if({cabecalho2} != '') $_sql_insert_cab .= '`'.{campo2}.'`,';
	if({cabecalho3} != '') $_sql_insert_cab .= '`'.{campo3}.'`,';
	if({cabecalho4} != '') $_sql_insert_cab .= '`'.{campo4}.'`,';
	if({cabecalho5} != '') $_sql_insert_cab .= '`'.{campo5}.'`,';

	$_sql_insert_cab = substr($_sql_insert_cab, 0, -1);
	$_sql_insert_cab .= " )";

	//valores
	$_sql_insert_campos = "VALUES";
	foreach ($dados as $linha){ // percorre linhas
		$_linha = str_replace(";", "','", $linha[0]);
		$_sql_insert_campos .= "('".$_linha."'),";
	}
	$_sql_insert_campos = substr($_sql_insert_campos, 0, -1); //remove ultima virgula

	//sql final
	$_sql_insert = $_sql_insert_cab.$_sql_insert_campos;


	// Inserir registros
	sc_exec_sql($_sql_insert);

	
	// Pega o número de registros inseridos
	$importados = mysql_affected_rows();
	$msg = "Registros importados: ".$importados;
	sc_alert($msg);
	
}

Print: http://imgur.com/3sZV1RF

Espero que sirva para ajudar alguém algum dia.

Att.

1 Curtida

Muito bom Thiago. Obrigado por compartilhar.

Meus Caros,

Estou fazendo um rotina de importação de dados com base numa planilha excell, fiz algo parecido com que foi sugerido aqui neste tópico, porém estou com problemas quando o nome do cliente possui acentuação, dá erro no insert.

1366: Incorrect string value: ‘\xDADIA C…’ for column ‘Nome’ at row 1
ADOConnection._Execute(INSERT INTO clientes( Nome,CelDDD,CelNum )VALUES(‘CLAÚDIA CORREIA DA SILVA’,‘81’,‘83024923’), false) % line 1085, file: adodb.inc.php
ADOConnection.Execute(INSERT INTO clientes( Nome,CelDDD,CelNum )VALUES(‘CLAÚDIA CORREIA DA SILVA’,‘81’,‘83024923’)) % line 1762, file: control_importa_clientes_apl.php
control_importa_clientes_apl.Valida_campos(null, null, null) % line 1058, file: control_importa_clientes_apl.php
control_importa_clientes_apl.controle() % line 1620, file: index.php

Minha base e tabela estão configurados para UTF-8.

Quando executo o insert diretamente no gerenciador do mysql o comando não da erro, mas via SC dá esse erro acima, me parece que eu tenho que tratar isso, mas não me lembro como resolver, alguém pode me dar a dica por favor ???

Ronaldo bom dia,

Que tipo de conexão estás usando com o MySQL? PDO ou Transactional? Se for PDO, experimente mudar para Transactional.

Kelyber,

Está configurado com Transacional, eu consegui resolver alterando o charset do arquivo CSV para UTF-8, aí rodou sem problemas.

Ótimo. Que bom que conseguiste resolver.

Foi um paliativo, o ideal é que eu pudesse tratar isso no código e então o sistema aceitar qualquer charset convertendo corretamente para o MySQL com UTF-8.

Caro Ronaldo por um acaso você conseguiu tratar isso via código?

Celso,

Ainda não meu caro, não encontrei uma solução para tratar isso via código. :frowning:

Correto.
Fiz os testes aqui em uma planilha pequena funcionou a dica do csv em Utf8 já em uma planilha grande 27000 linhas não vai.

Já tentou onde tem:

if({cabecalho2} != ‘’) $_sql_insert_cab .= ‘'.{campo2}.',’;

Fazer assim:

if({cabecalho2} != ‘’) $_sql_insert_cab .= ‘'.utf8_encode({campo2}).',’;

Teste com os dois (utf8_encode e utf8_decode)

Fred sua sugestão funcionou 100% os acentos estão corretos.
Agora estou recebendo esse erro:
[table][tr][td][left][table][tr][td][font=Times New Roman]Atenção[/font][/t][/t][/t][/left][/td][td][/td][/tr][tr][td][center]PDOStatement::execute(): send of 8192 bytes failed with errno=10053 Uma conexão estabelecida foi anulada pelo software no computador host.
PDOStatement::execute(): MySQL server has gone away
PDOStatement::execute(): Error reading result set’s header

[/center][/td][/tr][/table][/td][/tr][/table]

Esse erro da em que momento?

Pelo que vejo é ao ler os dados “já inseridos no banco”. Em fim, já adiantando… veja na aplicação o tipo de charset e altere ele. Para Utf8 ou para Latin. Teste com os dois.

Depois mude o tipo de conexão pra “Transitional” no projeto! Faça os testes. Não esquece de explicar em que momento ocorre o erro!