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).