Laravel-excel: Delimitador CSV

Criado em 15 out. 2014  ·  26Comentários  ·  Fonte: Maatwebsite/Laravel-Excel

Ao criar uma classe personalizada:

class CSVExcel  extends Excel {
    protected $delimiter  = ';';
}

E usando:

 CSVExcel::load('file.csv')->export('xls');

a configuração do delimitador não é respeitada

Comentários muito úteis

@ yailperalta-santex
Para usar o delimitador de tabulação em csv, você deve defini-lo assim "\t"
deve estar entre aspas duplas e não aspas simples
então a configuração em config/excel.php será assim
'delimiter' => "\t",

Todos 26 comentários

Você está misturando duas coisas: injeções de arquivo e fachadas.

Você está estendendo a classe de fachada, que não tem a propriedade $ delimitador.

O que você quer fazer é algo como:

class MyOwnFile extends ExcelFile {

    protected $delimiter = ';';

    public function getFile()
    {
        return storage_path('exports') . '/file.csv';
    }

}

class ExampleController {

    public function __construct(MyOwnFile $file)
    {
        $this->file = $file;
    }

    public function import()
    {
        // if using fileHandlers:
        $this->file->handleImport();

       // If you want to fetch inside the controller (which I wouldn't recommend)
       $this->file->get();
    }

    // or if you are using Laravel 5.0, you could use the method injection:
    public function import(MyOwnFile $file)
    {
        $file->handleImport();
    }
}

Se os documentos estiverem confusos sobre isso, por favor, me avise ou faça uma solicitação de pull para os documentos :)

Documentos sobre injeção de arquivos: http://www.maatwebsite.nl/laravel-excel/docs/import#injection

Como definir o Delimitador para CSV em tempo real. Na verdade, estou usando a função "Excel :: load" no meu controlador que estende o BaseController. Tive sucesso ao carregar .XLS, .XLSX e CSV com a configuração padrão, conforme mencionado no arquivo de configuração csv.php. Mas o problema é que eu tenho que pegar o User INput para o delimitador, como a entrada pode ser Pipesign, Tab, etc. ASSIM, como fazer isso? Por favor ajude.

Você pode usar métodos como setDelimiter() para substituir as configurações. Veja: https://github.com/Maatwebsite/Laravel-Excel/blob/master/src/Maatwebsite/Excel/Readers/LaravelExcelReader.php#L271

OK. Eu tenho usado :
$ results = Excel :: load ('uploads /'. $ filename, function ($ reader) {

                })->setDelimiter("|")->get();

mas está lendo todos os valores em uma única coluna, pois não leva "Delimitador de tubo". Por favor ajude.

Estou tendo o mesmo problema. Usando o Laravel 4. Aqui está o código do meu controlador:

public function uploadData()
{
        $file = Input::file('data')->getRealPath();

        \Excel::load($file, function($reader) {
                echo "<pre>";
                $reader->setDelimiter('|');
                print_r($reader->get());
        });
}

A saída não está sendo dividida no separador de tubo, em vez disso, está sendo tratada como uma longa string. Aqui está um exemplo:

    Maatwebsite\Excel\Collections\RowCollection Object
(
    [title:protected] => Worksheet
    [items:protected] => Array
        (
            [0] => Maatwebsite\Excel\Collections\CellCollection Object
                (
                    [title:protected] => 
                    [items:protected] => Array
                        (
                            [upc_numberitem_numberqty_availunit_pricedescriptioncolorqty_on_ponext_avail_dt] => 040176424354|53607-3037|0|14.50|PACK-N-GO DUFFELS 20?"|BIRDS ON A WIRE/LEAF GREEN||
                        )

                )

            [1] => Maatwebsite\Excel\Collections\CellCollection Object
                (
                    [title:protected] => 
                    [items:protected] => Array
                        (
                            [upc_numberitem_numberqty_availunit_pricedescriptioncolorqty_on_ponext_avail_dt] => 040176414850|53607-3054|0|14.50|PACK-N-GO DUFFELS 20?"|BLACK/BLACK/BLACK||
                        )

                )
)

Estou fazendo algo errado aqui? Por que as linhas não estão sendo analisadas na barra vertical?

Se eu alterar a configuração delimiter em config/csv.php , o arquivo será analisado corretamente. Por que não funciona usando o método setDelimiter() ?

Você deve alterar o delimitador antes que o arquivo seja carregado:

Excel::setDelimiter('|')->load(...);

Obrigado pela ajuda, mas agora está dando um erro:

iconv() expects parameter 1 to be string, object given

O erro está em Shared / String.php. É de alguma forma relacionado a isso?

https://github.com/Maatwebsite/Laravel-Excel/issues/382

E se você tentar configurá-lo dinamicamente com:

Config::set('excel::csv.delimiter, '|');

Funciona (Laravel 5.1):

Config::set('excel.csv.delimiter', '|');

ok, esse jeito funciona, mas por que esse jeito não funciona?

Excel::load($file->getPathName(), function($reader){
    $reader->setDelimiter(';')
    dd($reader->get());
});

Porque o arquivo já está carregado, não pode mais ser alterado no momento.

bem ... e se eu precisar importar 2 csv na mesma requisição, e um use ';' como delimitador e outro usa ',' eu preciso usar Config :: set 2 vezes? não há outra maneira?

Sim, dois Config :: set devem funcionar.

A versão 3 terá suporte para alterar o delimitador após o carregamento. Mas não estamos nem perto de um lançamento ainda.

muito obrigado pela resposta rápida

Estou usando o laravel 4.2, então o delimitador padrão não separa as colunas da maneira certa se uma das colunas estiver vazia

No Laravel 4, você pode definir o delimitador em tempo real com o seguinte:
Config::set('excel::csv.delimiter', '|');

Ref: https://laravel.com/docs/4.2/packages#package -configuration

por que fazer override, tudo existe em config / Excel.php

'csv'        => array(
    /*
   |--------------------------------------------------------------------------
   | Delimiter
   |--------------------------------------------------------------------------
   |
   | The default delimiter which will be used to read out a CSV file
   |
   */

    'delimiter'   => ';',

    /*
    |--------------------------------------------------------------------------
    | Enclosure
    |--------------------------------------------------------------------------
    */

    'enclosure'   => '',

    /*
    |--------------------------------------------------------------------------
    | Line endings
    |--------------------------------------------------------------------------
    */

    'line_ending' => "\r\n",

    /*
    |--------------------------------------------------------------------------
    | setUseBom
    |--------------------------------------------------------------------------
    */

    'use_bom' => false
),

definir delimitador acima do Excel :: carregar assim. É trabalho para mim no laravel 5.3

       Excel::setDelimiter('|');

Excel :: load ($ filename, function ($ reader) {

            foreach ($reader->toArray() as $row) {

                 $data[] = $row;
            }
              print_r($data);
        });

@medamineDev config / Excel.php é para uso geral. Você deve substituir quando o sistema deve processar arquivos que possuem um separador / delimitador diferente.

Oi, como definir o delimitador de tabulação?

Experimente /t

@jediscript Obrigado, mas / t não funciona, diz que o delimitador deve ter 1 caractere.

@ yailperalta-santex que problema você está tentando resolver com esta biblioteca? Talvez você possa usar http://php.net/manual/en/function.fgetcsv.php .

@ yailperalta-santex
Para usar o delimitador de tabulação em csv, você deve defini-lo assim "\t"
deve estar entre aspas duplas e não aspas simples
então a configuração em config/excel.php será assim
'delimiter' => "\t",

$ data = Excel :: setDelimiter ("t") -> load (storage_path (). '/ uploads / import / data.csv') -> get ();

Esta página foi útil?
0 / 5 - 0 avaliações