При создании собственного класса:
class CSVExcel extends Excel {
protected $delimiter = ';';
}
И используя:
CSVExcel::load('file.csv')->export('xls');
установка разделителя не соблюдается
Вы смешиваете две вещи: инъекции файлов и фасады.
Вы расширяете класс фасада, у которого нет свойства $ delimiter.
Вы хотите сделать что-то вроде:
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();
}
}
Если в документации это сбивает с толку, дайте мне знать или сделайте запрос на перенос документов :)
Документы о внедрении файлов: http://www.maatwebsite.nl/laravel-excel/docs/import#injection
Как установить разделитель для CSV на лету. На самом деле я использую в своем контроллере функцию «Excel :: load», которая расширяет BaseController. Мне удалось загрузить .XLS, .XLSX и CSV с настройкой по умолчанию, как указано в файле конфигурации csv.php. Но проблема в том, что я должен использовать User INput в качестве разделителя, например, ввод может быть Pipesign, Tab и т. Д. Итак, как это сделать? Пожалуйста помоги.
Вы можете использовать такие методы, как setDelimiter()
чтобы переопределить настройки конфигурации. См. Https://github.com/Maatwebsite/Laravel-Excel/blob/master/src/Maatwebsite/Excel/Readers/LaravelExcelReader.php#L271
Ok. Я использовал :
$ results = Excel :: load ('uploads /'. $ filename, function ($ reader) {
})->setDelimiter("|")->get();
но он читает все значения в одном столбце, так как он не принимает «Разделитель труб». Пожалуйста помоги.
У меня такая же проблема. Используя Laravel 4. Вот код моего контроллера:
public function uploadData()
{
$file = Input::file('data')->getRealPath();
\Excel::load($file, function($reader) {
echo "<pre>";
$reader->setDelimiter('|');
print_r($reader->get());
});
}
Вывод не разделяется на разделителе каналов, вместо этого он обрабатывается как одна длинная строка. Вот пример:
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||
)
)
)
Я здесь что-то не так делаю? Почему строки не анализируются на символе вертикальной черты?
Если я изменю параметр delimiter
в config/csv.php
, файл будет проанализирован правильно. Почему не работает метод setDelimiter()
?
Вы должны изменить разделитель перед загрузкой файла:
Excel::setDelimiter('|')->load(...);
Спасибо за помощь, но теперь возникает ошибка:
iconv() expects parameter 1 to be string, object given
Ошибка находится в Shared / String.php. Это как-то связано с этим?
https://github.com/Maatwebsite/Laravel-Excel/issues/382
Что, если вы попытаетесь установить его на лету с помощью:
Config::set('excel::csv.delimiter, '|');
Это работает (Laravel 5.1):
Config::set('excel.csv.delimiter', '|');
хорошо, этот способ работает, но почему этот способ не работает?
Excel::load($file->getPathName(), function($reader){
$reader->setDelimiter(';')
dd($reader->get());
});
Поскольку файл уже загружен, в настоящее время его нельзя изменить.
хорошо ... и если мне нужно импортировать 2 CSV по одному и тому же запросу и одно использование ';' в качестве разделителя, а другой использует ',' мне нужно использовать Config :: set 2 раза? нет другого выхода?
Да, два Config :: set должны работать.
Версия 3 будет поддерживать изменение разделителя после загрузки. Но мы еще не приблизились к релизу.
большое спасибо за быстрый ответ
Я использую laravel 4.2, поэтому разделитель по умолчанию не разделяет столбцы правильным образом, если один из столбцов пуст
В Laravel 4 вы можете установить разделитель на лету следующим образом:
Config::set('excel::csv.delimiter', '|');
Ссылка: https://laravel.com/docs/4.2/packages#package -configuration
зачем делать переопределение, все существует в 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
),
установить разделитель Над Excel :: load вот так. Его работа для меня на laravel 5.3
Excel::setDelimiter('|');
Excel :: load ($ filename, function ($ reader) {
foreach ($reader->toArray() as $row) {
$data[] = $row;
}
print_r($data);
});
@medamineDev config / Excel.php предназначен для общего использования. Вы должны переопределить, когда система должна обрабатывать файлы с другим разделителем / разделителем.
Привет, как установить разделитель табулятора?
Попробуйте /t
@jediscript Спасибо, но / t не работает, говорит, что разделитель должен состоять из 1 символа.
@ yailperalta-santex какую проблему вы пытаетесь решить с помощью этой библиотеки? Возможно, вы можете вместо этого использовать http://php.net/manual/en/function.fgetcsv.php .
@ yailperalta-santex
Чтобы использовать разделитель табуляции в csv, вы должны установить его так: "\t"
он должен быть в двойных кавычках, а не в одинарных кавычках
поэтому конфигурация в config/excel.php
будет такой
'delimiter' => "\t",
$ data = Excel :: setDelimiter ("t") -> load (storage_path (). '/ uploads / imports / data.csv') -> get ();
Самый полезный комментарий
@ yailperalta-santex
Чтобы использовать разделитель табуляции в csv, вы должны установить его так:
"\t"
он должен быть в двойных кавычках, а не в одинарных кавычках
поэтому конфигурация в
config/excel.php
будет такой'delimiter' => "\t",