Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

vectorlounge

Gerar arquivo CSV apartir de uma consulta no BD

Recommended Posts

Olá pessoal. Estou precisando de uma ajuda de você, procurei aqui no forum mas não encontrei nada que me ajudasse neste problemas.

 

Bom, vamos lá.

 

Eu preciso gerar um arquivo CSV a partir de uma tabela no banco de dados. Tenho um arquivo que lista todas as entradas que eu tenho nesta tabela, e o que eu preciso é aidiconar um botão neste arquivo que gere um arquivo CSV em uma determinada pasta do meu diretório e com sobreposição de arquivo, ou seja, quando o usuário clicar no botão gerar arquivo CSV, o sistema pega os dados na tabela, gera o arquivos CSV e joga em uma pasta pré-definida e sobreponha o arquivo já existente.

 

E ainda pra piorar meu problema, eu preciso de esse arquivo CSV tenha o nome do cliente(nomedocliente.csv), que neste caso ele pode pegar o nome do arquivo em um linha da tabela.

 

Alguem pode me ajudar neste problema? Fico grato a todos!

 

Abraços

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu preciso gerar um arquivo CSV a partir de uma tabela no banco de dados. Tenho um arquivo que lista todas as entradas que eu tenho nesta tabela, e o que eu preciso é aidiconar um botão neste arquivo que gere um arquivo CSV em uma determinada pasta do meu diretório e com sobreposição de arquivo, ou seja, quando o usuário clicar no botão gerar arquivo CSV, o sistema pega os dados na tabela, gera o arquivos CSV e joga em uma pasta pré-definida e sobreponha o arquivo já existente.

 

Bom, como o próprio nome já diz, CSV é Comma separated values, ou seja, valores separados por vírgula. Sendo assim:

 

<?php
/**
 * Gera um documento com valores separados por vírgula
 */
class CSV {
    /**
     * Matriz que irá armazenar todas as linhas do CSV
     * @var array
     */
    private $data = array();

    /**
     * Número de colunas
     * @var integer
     */
    private $fields = 0;

    /**
     * Salva o arquivo em disco
     * @param string $file O nome do arquivo
     */
    public function save( $file ){
        $dir = dirname( $file );
        $ret = false;

        if ( !empty( $dir ) ){
            if ( !is_dir( $dir ) ){
                throw new Exception( "O diretório não existe." );
            }
        }

        if ( file_exists( $file ) ){
            if ( !is_writable( $file ) ){
                throw new Exception( "O arquivo de destino não é gravável." );
            }
        }

        if ( ( $fh = fopen( $file , "w+" ) ) ){
            $csv = (string) $this;
            fwrite( $fh , $csv , strlen( $csv ) );
            fclose( $fh );
            $ret = true;
        } else {
            throw new Exception( "Não foi possível abrir/criar o arquivo para gravação." );
        }

        return( $ret );
    }

    /**
     * Adiciona uma nova linha ao CSV
     * @param CSVLine $line A linha que será adicionada
     * @return CSV Referência ao próprio objeto
     */
    public function addLine( CSVLine $line ){
        if ( !count( $this->data ) ){
            $this->fields = $line->count();
        } elseif ( $this->fields != $line->count() ){
            throw new Exception( "Todas as linhas devem ter o mesmo número de colunas" );
        }

        $this->data[] = $line;
        return( $this );
    }

    /**
     * Converte o objeto para sua representação em string
     * @return string
     */
    public function __toString(){
        return( implode( "\n" , $this->data ) );
    }
}


/**
 * Gera uma linha de um documento com valores separados por vírgula
 */
class CSVLine {
    /**
     * Matriz que irá armazenar os dados das colunas
     * @var array
     */
    private $data = array();

    /**
     * Número de campos da linha
     * @var integer
     */
    private $fields = 0;

    /**
     * Constroi uma nova linha de valores separados por vírgula
     * @param mixed $arg1[optional] Um valor que será armazenado na linha
     * @param mixed $arg2[optional] Um valor que será armazenado na linha
     * @param mixed ... Um valor que será armazenado na linha
     * @param mixed $argn[optional] Um valor que será armazenado na linha
     */
    public function __construct( $arg1 , $arg2 , $argn ){
        $argv = func_get_args();
        $argc = count( $argv );

        for ( $i = 0 ; $i < $argc ; $i++ ){
            $this->addData( $argv[ $i ] );
        }
    }

    /**
     * Converte o objeto para sua representação em string
     * @return string
     */
    public function __toString(){
        return( implode( "," , $this->data ) );
    }

    /**
     * Adiciona um novo valor à linha
     * @param mixed $value Um valor qualquer
     * @return CSVLine Referência ao próprio objeto
     */
    public function addData( $value ){
        if ( preg_match( "/(,|\r\n|\n|\"|')+/" , $value ) ){
            $value = preg_replace( "/\"+/" , "\"\"" , $value );
            $value = sprintf( "\"%s\"" , $value );
        }

        $this->data[] = $value;
        ++$this->fields;
    }

    /**
     * Conta o número de colunas que a linha possui
     * @return integer
     */
    public function count(){
        return( count( $this->data ) );
    }
}

Agora usando os mesmos dados da Wikipédia:

 

$csv = new CSV();

$csv
    ->addLine( new CSVLine( 1997 , "Ford"  , "E350" , "ac, abs, moon" , 3000.00 ) )
    ->addLine( new CSVLine( 1999 , "Chevy" , "Venture \"Extended Edition\"" , null , 4900.00 ) )
    ->addLine( new CSVLine( 1996 , "Jeep"  , "Grand Cherokee" , "MUST SELL!
air, moon roof, loaded" , 4799.00 ) );

$csv->save( "pasta/arquivo.csv" );

O conteúdo do seu arquivo será:

1997,Ford,E350,"ac, abs, moon",3000
1999,Chevy,"Venture ""Extended Edition""",,4900
1996,Jeep,Grand Cherokee,"MUST SELL!
air, moon roof, loaded",4799

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá João,

 

Obrigado por responder. Eu não entendi como funciona seu script. Como faço pra informar de qual BD e tabela o sistema vai pegar os dados para gerar o arquivo CSV?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom... você vai ter vários processos...

1 - Fazer a consulta - pelo jeito está OK.

2 - Gravar o arquivo em CSV no diretório com o nome do cliente - Pelo jeito não está OK.

3 - Sobrescrever caso o arquivo exista - Pelo jeito não está OK.

 

Agora vamos as dicas.

2 - Para fazer o CSV com a consulta, veja este link. http://forum.imasters.com.br/index.php?/topic/256608-gerar-csv-apartir-de-uma-consulta-sql/.

3 - Para sobrescrever, deve ter uma forma melhor, mas só lembro desta. Use fopen() com o modo w+. http://br.php.net/manual/pt_BR/function.fopen.php.

 

A lógica é mais ou menos esta. Você pode fazer a coisa mais simples ou mais complexa, dependendo do seu conhecimento em PHP.

 

Carlos Eduardo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado por responder. Eu não entendi como funciona seu script. Como faço pra informar de qual BD e tabela o sistema vai pegar os dados para gerar o arquivo CSV?

 

Bom a idéia é que a classe CSV apenas auxilie na parte chata, a consulta você faz normalmente, como qualquer outra consulta:

 

 mysql> select * from `veiculos`;
 +----+------+-----------+----------------------------+-----------------------------------+----------+
 | id | ano  | montadora | modelo                     | observacao                        | valor    |
 +----+------+-----------+----------------------------+-----------------------------------+----------+
 |  1 | 1997 | Ford      | E350                       | ac, abs, moon                     | 3000.000 |
 |  2 | 1999 | Chevy     | Venture "Extended Edition" | NULL                              | 4900.000 |
 |  3 | 1996 | Jeep      | Grand Cherokee             | MUST SELL!
 air, moon roof, loaded | 4799.000 |
 +----+------+-----------+----------------------------+-----------------------------------+----------+
 3 rows in set (0.00 sec)

Imagine que você tenha a tabela veiculos no banco de dados como mostrado acima e queira você pegar os registros e guardar em um arquivo CSV:

 

Você pega a classe CSVLine e salva no arquivo CSVLine.php:

 

CSVLine.php

 <?php
 /**
  * Gera uma linha de um documento com valores separados por vírgula
  */
 class CSVLine {
     /**
      * Matriz que irá armazenar os dados das colunas
      * @var array
      */
     private $data = array();
 
     /**
      * Número de campos da linha
      * @var integer
      */
     private $fields = 0;
 
     /**
      * Constroi uma nova linha de valores separados por vírgula
      * @param mixed $arg1[optional] Um valor que será armazenado na linha
      * @param mixed $arg2[optional] Um valor que será armazenado na linha
      * @param mixed ... Um valor que será armazenado na linha
      * @param mixed $argn[optional] Um valor que será armazenado na linha
      */
     public function __construct(){
         $argv = func_get_args();
         $argc = count( $argv );
 
         for ( $i = 0 ; $i < $argc ; $i++ ){
             $this->addData( $argv[ $i ] );
         }
     }
 
     /**
      * Converte o objeto para sua representação em string
      * @return string
      */
     public function __toString(){
         return( implode( "," , $this->data ) );
     }
 
     /**
      * Adiciona um novo valor à linha
      * @param mixed $value Um valor qualquer
      * @return CSVLine Referência ao próprio objeto
      */
     public function addData( $value ){
         if ( preg_match( "/(,|rn|n|"|')+/" , $value ) ){
             $value = preg_replace( "/"+/" , """" , $value );
             $value = sprintf( ""%s"" , $value );
         }
 
         $this->data[] = $value;
         ++$this->fields;
 
         return( $this );
     }
 
     /**
      * Conta o número de colunas que a linha possui
      * @return integer
      */
     public function count(){
         return( count( $this->data ) );
     }
 }

E pega a classe CSV e salva no arquivo CSV.php:

 

CSV.php

 <?php
 /**
  * Classe CSVLine requerida pela classe CSV
  * @uses CSVLine
  */
 require_once( "CSVLine.php" );
 
 /**
  * Gera um documento com valores separados por vírgula
  */
 class CSV {
     /**
      * Matriz que irá armazenar todas as linhas do CSV
      * @var array
      */
     private $data = array();
 
     /**
      * Número de colunas
      * @var integer
      */
     private $fields = 0;
 
     /**
      * Salva o arquivo em disco
      * @param string $file O nome do arquivo
      */
     public function save( $file ){
         $dir = dirname( $file );
         $ret = false;
 
         if ( !empty( $dir ) ){
             if ( !is_dir( $dir ) ){
                 throw new Exception( "O diretório não existe." );
             }
         }
 
         if ( file_exists( $file ) ){
             if ( !is_writable( $file ) ){
                 throw new Exception( "O arquivo de destino não é gravável." );
             }
         }
 
         if ( ( $fh = fopen( $file , "w+" ) ) ){
             $csv = (string) $this;
             fwrite( $fh , $csv , strlen( $csv ) );
             fclose( $fh );
             $ret = true;
         } else {
             throw new Exception( "Não foi possível abrir/criar o arquivo para gravação." );
         }
 
         return( $ret );
     }
 
     /**
      * Adiciona uma nova linha ao CSV
      * @param CSVLine $line A linha que será adicionada
      * @return CSV Referência ao próprio objeto
      */
     public function addLine( CSVLine $line ){
         if ( !count( $this->data ) ){
             $this->fields = $line->count();
         } elseif ( $this->fields != $line->count() ){
             throw new Exception( "Todas as linhas devem ter o mesmo número de colunas" );
         }
 
         $this->data[] = $line;
         return( $this );
     }
 
     /**
      * Converte o objeto para sua representação em string
      * @return string
      */
     public function __toString(){
         return( implode( "n" , $this->data ) );
     }
 }

Agora sempre que você precisar gerar um CSV partindo de uma consulta no banco de dados você basta incluir a CSV no seu código e fazer a consulta normalmente:

 

 /**
  * Precisamos da classe CSV
  */
 require( "CSV.php" );
 
 
 $dbhost = "127.0.0.1";
 $dbname = "test";
 $dbpswd = "senhya";
 $dbuser = "user";
 $sql    = "select * from `veiculos`;";
 
 if ( ( $conn = mysql_connect( $dbhost , $dbuser , $dbpswd ) ) ){
     mysql_select_db( $dbname );
 
     if ( ( $res = mysql_query( $sql , $conn ) ) ){
         $csv = new CSV(); //Aqui instanciamos a classe CSV
 
         while ( ( $row = mysql_fetch_array( $res , MYSQL_ASSOC ) ) ){
             $line = new CSVLine(); //Criamos uma instância de CSVLine para cada linha do result-set
             $line
                 ->addData( $row[ "ano" ] )
                 ->addData( $row[ "montadora" ] )
                 ->addData( $row[ "modelo" ] )
                 ->addData( $row[ "observacao" ] )
                 ->addData( $row[ "valor" ] ); //Adicionamos as colunas
 
             $csv->addLine( $line ); //Adicionamos a linha que acabamos de criar à instância da classe CSV
         }
 
         mysql_free_result( $res );
 
         $csv->save( "pasta/arquivo.csv" ); //Salvamos o arquivo CSV
     }
 
     mysql_close( $conn );
 }

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.