创建自定义类时:
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 :
如何动态设置 CSV 的分隔符。 实际上,我在扩展 BaseController 的控制器中使用了“Excel::load”函数。 我已经成功加载了 .XLS、.XLSX 和 CSV 以及 csv.php 配置文件中提到的 defsult 设置。 但问题是我必须将用户输入作为分隔符,如输入可以是 Pipesign、Tab 等。所以怎么做? 请帮忙。
您可以使用setDelimiter()
来覆盖配置设置。 参见: https :
好的。 我用过了 :
$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||
)
)
)
我在这里做错了吗? 为什么不在管道字符上解析行?
如果我更改config/csv.php
的delimiter
设置,文件将被正确解析。 为什么使用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",