Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

14
respostas

Problema de importacao de XLS/XLSX/CSV para phpMyAdmin

Srs. Sou iniciante em PHP e gostaria que as respostas fossem bem detalhadas para que eu consiga executar.

Preciso importar um arquivo do excel para phpMyAdmin, o erro quando executo no browser é:

( ! ) Parse error: syntax error, unexpected '$path' (T_VARIABLE), expecting function (T_FUNCTION) in C:\wamp64\www\imp\ImportaPlanilha.class.php on line 25

Segue o código que estou executando: arquivo: ImportaPlanilha.class.php

<?php 
ini_set('max_execution_time','-1');
require_once "SimpleXLSX.class.php";

class ImportaPlanilha{

    // Atributo recebe a instância da conexão PDO
    private $conexao  = null;

     // Atributo recebe uma instância da classe SimpleXLSX
    private $planilha = null;

    // Atributo recebe a quantidade de linhas da planilha
    private $linhas   = null;

    // Atributo recebe a quantidade de colunas da planilha
    private $colunas  = null;

    /*
     * Método Construtor da classe
     * @param $path - Caminho e nome da planilha do Excel xlsx
     * @param $conexao - Instância da conexão PDO
     */

    $path = (C:/wamp64/www/imp/cancelada.xlsx);   //  ERRO AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    $conexao = mysqli_connect("localhost","root","","import");    

    public function __construct($path=null, $conexao=null){

        if(!empty($path) && file_exists($path)):
            $this->planilha = new SimpleXLSX($path);
            list($this->colunas, $this->linhas) = $this->planilha->dimension();
        else:
            echo 'Arquivo não encontrado!';
            exit();
        endif;

        if(!empty($conexao)):
            $this->conexao = $conexao;
        else:
            echo 'Conexão não informada!';
            exit();
        endif;

    }


    /*
     * Método para ler os dados da planilha e inserir no banco de dados
     * @return Valor Inteiro contendo a quantidade de linhas importadas
     */
    public function insertDados(){

        try{
            $sql = 'INSERT INTO cancelada (
                im,    
                cnpj_cpf, 
                razao_social, 
                nr_nota, 
                competencia, 
                cod_ativ, 
                desc_serv, 
                cod_serv, 
                local_prest, 
                cnpj_cpf_tomador, 
                razao_social_tomador, 
                tomador_estabelecido, 
                cidade_tomador, 
                motivo_cancelamento, 
                valor_faturado, 
                substituida)VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
            $stm = $this->conexao->prepare($sql);

            $linha = 0;
            foreach($this->planilha->rows() as $chave => $valor):
                if ($chave >= 1 ):        
                    $im                        = trim($valor[0]);    
                    $cnpj_cpf                = trim($valor[1]);
                    $razao_social            = trim($valor[2]);         
                    $nr_nota                = trim($valor[3]); 
                    $competencia            = trim($valor[4]); 
                    $cod_ativ                = trim($valor[5]); 
                    $desc_serv                = trim($valor[6]); 
                    $cod_serv                = trim($valor[7]); 
                    $local_prest            = trim($valor[8]); 
                    $cnpj_cpf_tomador        = trim($valor[9]); 
                    $razao_social_tomador    = trim($valor[10]); 
                    $tomador_estabelecido    = trim($valor[11]); 
                    $cidade_tomador            = trim($valor[12]); 
                    $motivo_cancelamento    = trim($valor[13]);
                    $valor_faturado            = trim($valor[14]); 
                    $substituida            = trim($valor[15]);

                    $stm->bindValue(1, $im);
                    $stm->bindValue(2, $cnpj_cpf);
                    $stm->bindValue(3, $razao_social);
                    $stm->bindValue(4, $nr_nota);
                    $stm->bindValue(5, $competencia);
                    $stm->bindValue(6, $cod_ativ);
                    $stm->bindValue(7, $desc_serv);
                    $stm->bindValue(8, $cod_serv);
                    $stm->bindValue(9, $local_prest);
                    $stm->bindValue(10, $cnpj_cpf_tomador);
                    $stm->bindValue(11, $razao_social_tomador);
                    $stm->bindValue(12, $tomador_estabelecido);
                    $stm->bindValue(13, $cidade_tomador);
                    $stm->bindValue(14, $motivo_cancelamento);
                    $stm->bindValue(15, $valor_faturado);
                    $stm->bindValue(16, $substituida);
                                        $retorno = $stm->execute();

                    if($retorno == true) $linha++;
                 endif;
            endforeach;

            return $linha;
        }catch(Exception $erro){
            echo 'Erro: ' . $erro->getMessage();
        }

    }
}
14 respostas

Ola Chadu

Precisa das aspas para definir a string:

$path = "C:/wamp64/www/imp/cancelada.xlsx";

Caro Paulo, O erro continua na mesma linha...

Parse error: syntax error, unexpected '$path' (T_VARIABLE), expecting function (T_FUNCTION) in C:\wamp64\www\imp\ImportaPlanilha.class.php on line 25

Agora vi. Voce precisa declarar path como privado tambem, e apenas dentro do construct voce deve fazer path = alguma coisa e conexao = alguma coisa.

Coloquei as variáveis dentro do construct Até agora aprendi que a variável deve ser declarada fora das chaves "{", mas estou seguindo sua sugestão...

    public function __construct($path=null, $conexao=null){

        private $path = "C:/wamp64/www/imp/cancelada.xlsx";
        private $conexao = mysqli_connect("localhost","root","","import");    

        if(!empty($path) && file_exists($path)):

O erro continua na linha do "PATH"... Parse error: syntax error, unexpected 'private' (T_PRIVATE) in C:\wamp64\www\imp\ImportaPlanilha.class.php on line 29

oi Chadu

A variavel, quando atributo, fica declarada fora do método (poderia ate inicializa). Depois, quando for utiliza-la, voce usa dentro do método. Assim:

        private $path;
        private $conexao;    

 public function __construct($path=null, $conexao=null){

        $path = "C:/wamp64/www/imp/cancelada.xlsx";
        $conexao = mysqli_connect("localhost","root","","import");

Repare que dentro do método voce nao fala o private. O private é um modificador de acesso do atributo, que só pode ser usado quando declarado. Nas linhas dentro do método você não está mais declarado, e sim usando algo que voce la fora disse que precisaria para aquele tipo de objeto

Caro Paulo, Acho que vc pegou o espirito da coisa! rs

O erro agora é apresentado na linha de conexão com o banco. Não sei onde está o erro pq usei o mesmo código que utilizamos no projeto "loja"

Fatal error: Cannot redeclare ImportaPlanilha::$conexao in C:\wamp64\www\imp\ImportaPlanilha.class.php on line 26

        $conexao = mysqli_connect("localhost","root","","import");

Veja se nao tem private $conexao = null; declarado duas vezes dentro do seu codigo

Tinha sim

linha 8

private $conexao  = null;

linha 26

private $conexao;

Tirei o código da linha 8 deixando apenas da linha 26.

O erro agora é apresentado no arquivo index.php:

Fatal error: Call to undefined method ImportaPlanilha::getQtdeLinhas() in C:\wamp64\www\imp\index.php on line 17

echo 'Quantidade de Linhas na Planilha ' , $obj->getQtdeLinhas(), '<br>';

A mensagem Call to undefined method ImportaPlanilha::getQtdeLinhas() in indica que o método getQtdeLinhas que você está chamando não existe, ou você digitou alguma letra/maisucula errado.

o método está no ImportaPlanilha.class.php e é chamado no index.php

<?php 
ini_set('max_execution_time','-1');
require_once "SimpleXLSX.class.php";

class ImportaPlanilha{

    // Atributo recebe a instância da conexão PDO
    //    private $conexao  = null;

     // Atributo recebe uma instância da classe SimpleXLSX
    private $planilha = null;

    // Atributo recebe a quantidade de linhas da planilha
    private $linhas   = null;

    // Atributo recebe a quantidade de colunas da planilha
    private $colunas  = null;

    /*
     * Método Construtor da classe
     * @param $path - Caminho e nome da planilha do Excel xlsx
     * @param $conexao - Instância da conexão PDO
     */

    private $path;
    private $conexao;    

    public function __construct($path=null, $conexao=null){

        $path = "C:/wamp64/www/imp/cancelada.xlsx";
        $conexao = mysqli_connect("localhost","root","","import");    

        if(!empty($path) && file_exists($path)):
            $this->planilha = new SimpleXLSX($path);
            list($this->colunas, $this->linhas) = $this->planilha->dimension();
        else:
            echo 'Arquivo não encontrado!';
            exit();
        endif;

        if(!empty($conexao)):
            $this->conexao = $conexao;
        else:
            echo 'Conexão não informada!';
            exit();
        endif;

    }


    /*
     * Método para ler os dados da planilha e inserir no banco de dados
     * @return Valor Inteiro contendo a quantidade de linhas importadas
     */
    public function insertDados(){

        try{
            $sql = 'INSERT INTO cancelada (
                im,    
                cnpj_cpf, 
                razao_social, 
                nr_nota, 
                competencia, 
                cod_ativ, 
                desc_serv, 
                cod_serv, 
                local_prest, 
                cnpj_cpf_tomador, 
                razao_social_tomador, 
                tomador_estabelecido, 
                cidade_tomador, 
                motivo_cancelamento, 
                valor_faturado, 
                substituida)VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)';
            $stm = $this->conexao->prepare($sql);

            $linha = 0;
            foreach($this->planilha->rows() as $chave => $valor):
                if ($chave >= 1 ):        
                    $im                        = trim($valor[0]);    
                    $cnpj_cpf                = trim($valor[1]);
                    $razao_social            = trim($valor[2]);         
                    $nr_nota                = trim($valor[3]); 
                    $competencia            = trim($valor[4]); 
                    $cod_ativ                = trim($valor[5]); 
                    $desc_serv                = trim($valor[6]); 
                    $cod_serv                = trim($valor[7]); 
                    $local_prest            = trim($valor[8]); 
                    $cnpj_cpf_tomador        = trim($valor[9]); 
                    $razao_social_tomador    = trim($valor[10]); 
                    $tomador_estabelecido    = trim($valor[11]); 
                    $cidade_tomador            = trim($valor[12]); 
                    $motivo_cancelamento    = trim($valor[13]);
                    $valor_faturado            = trim($valor[14]); 
                    $substituida            = trim($valor[15]);

                    $stm->bindValue(1, $im);
                    $stm->bindValue(2, $cnpj_cpf);
                    $stm->bindValue(3, $razao_social);
                    $stm->bindValue(4, $nr_nota);
                    $stm->bindValue(5, $competencia);
                    $stm->bindValue(6, $cod_ativ);
                    $stm->bindValue(7, $desc_serv);
                    $stm->bindValue(8, $cod_serv);
                    $stm->bindValue(9, $local_prest);
                    $stm->bindValue(10, $cnpj_cpf_tomador);
                    $stm->bindValue(11, $razao_social_tomador);
                    $stm->bindValue(12, $tomador_estabelecido);
                    $stm->bindValue(13, $cidade_tomador);
                    $stm->bindValue(14, $motivo_cancelamento);
                    $stm->bindValue(15, $valor_faturado);
                    $stm->bindValue(16, $substituida);
                                        $retorno = $stm->execute();

                    if($retorno == true) $linha++;
                 endif;
            endforeach;

            return $linha;
        }catch(Exception $erro){
            echo 'Erro: ' . $erro->getMessage();
        }

    }
}

Este é o código do arquivo index.php na íntegra...

<?php 

/* Seta configuração para não dar timeout */
ini_set('max_execution_time','-1');

/* Require com a classe de importação construída */
require 'ImportaPlanilha.class.php';

/* Instância conexão PDO com o banco de dados */
//$pdo = new PDO('mysql:host=localhost;dbname=import', 'root', '');
$conexao = mysqli_connect("localhost","root","","import");    

/* Instância o objeto importação e passa como parâmetro o caminho da planilha e a conexão PDO */
$obj = new ImportaPlanilha('C:\wamp64\www\imp\cancelada.xlsx', $conexao);

/* Chama o método que retorna a quantidade de linhas */
ehoc 'Quantidade de Linhas na Planilha ' , $obj->getQtdeLinhas(), '<br>';

/* Chama o método que retorna a quantidade de colunas */
echo 'Quantidade de Colunas na Planilha ' , $obj->getQtdeColunas(), '<br>';

/* Chama o método que inseri os dados e captura a quantidade linhas importadas */
$linhasImportadas = $obj->insertDados();

/* Imprime a quantidade de linhas importadas */
echo 'Foram importadas ', $linhasImportadas, ' linhas';

Nao estou vendo o metodo dentro do seu ImportaPlanilha. So tem o construct e o insereDados ai, nao?

Na linha 14

 // Atributo recebe a quantidade de linhas da planilha
    private $linhas   = null;

Se não for aí, me informe como deve ser...

Oi Chadu

Isso aqui:

$obj->getQtdeLinhas()

Indica que dentro da classe ImportaPlanilha deveria haver uma function com o nome getQtdeLinhas. É o trecho de código que ele deveria executar.

Não conheço esse código, precisa ver com quem criou. Provavelmente deveria ser um método que apenas faz return $linhas. Mas tá faltando codigo.

Olá Chadu!

Estava lendo suas dúvidas e reparei em algumas coisas:

Na sua primeira mensagem, seu código estava assim:

$path = (C:/wamp64/www/imp/cancelada.xlsx);   //  ERRO AQUI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
$conexao = mysqli_connect("localhost","root","","import");    

public function __construct($path=null, $conexao=null){
        if(!empty($path) && file_exists($path)):

Tem dois problemas aqui, um deles, como pontuado pelo Paulo Silveira, é o uso das aspas, pois textos (Strings) no PHP são definidos dentro de aspas ou apóstrofos.

$path = 'C:/wamp64/www/imp/cancelada.xlsx';

O segundo ponto é que essas duas primeiras linhas ficaram no lugar errado, analisando o código como um todo essas duas linhas já foram definidas no seu index.php. Repare que você tem elas no index.php e você envia-as para o seu objeto passando pelo construtor:

$conexao = mysqli_connect("localhost","root","","import");    

/* Instância o objeto importação e passa como parâmetro o caminho da planilha e a conexão PDO */
$obj = new ImportaPlanilha('C:\wamp64\www\imp\cancelada.xlsx', $conexao);

Isso significa o começo da sua classe deve ficar assim:

class ImportaPlanilha{

    // Atributo recebe a instância da conexão PDO
    private $conexao  = null;

     // Atributo recebe uma instância da classe SimpleXLSX
    private $planilha = null;

    // Atributo recebe a quantidade de linhas da planilha
    private $linhas   = null;

    // Atributo recebe a quantidade de colunas da planilha
    private $colunas  = null;

    /*
     * Método Construtor da classe
     * @param $path - Caminho e nome da planilha do Excel xlsx
     * @param $conexao - Instância da conexão PDO
     */
    public function __construct($path=null, $conexao=null){
        if(!empty($path) && file_exists($path)):

Repare que não tem uma propriedade $path definida antes de __construct (isso foi colocado erroneamente no meio das discussões aqui no fórum) e não tem nada no construtor antes do if (também colocado erroneamente no meio das discussões aqui no fórum).

Continuando, repare que no construtor da sua classe você executa o seguinte:

if(!empty($path) && file_exists($path)):
        $this->planilha = new SimpleXLSX($path);
        list($this->colunas, $this->linhas) = $this->planilha->dimension();
else:
       echo 'Arquivo não encontrado!';
       exit();
endif;

A linha que possui list conversa com a biblioteca externa que você está utilizando (SimpleXLSX.class.php) e pega a quantidade de colunas e a quantidade de linhas da planilha. Com esses valores em mãos, você atribui eles para duas das propriedades do seu objeto, respectivamente, colunas e linhas.

Com essas propriedades preenchidas, você pode agora criar um método na sua classe, por exemplo, getQtdeLinhas, que simplesmente retorna a propriedade linhas.

public function insertDados(){
    ... // código do insert dados aqui
}

// logo abaixo você pode definir outro método
public function getQtdeLinhas()
{
    return $this->linhas; // retorna a qtd de linhas
}

Da mesma forma você pode fazer com as colunas, adicione mais um método igual o código anterior, com a diferença que ao invés de linhas será colunas (getQtdeColunas e return $this->colunas).