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
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 ();
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",