Laravel-excel: CSV 分隔符

创建于 2014-10-15  ·  26评论  ·  资料来源: Maatwebsite/Laravel-Excel

创建自定义类时:

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

并使用:

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

不遵守分隔符设置

最有用的评论

@yailperalta-santex
要在 csv 中使用制表符分隔符,您必须像这样设置它"\t"
它必须是双引号而不是单引号
所以config/excel.php会是这样
'delimiter' => "\t",

所有26条评论

您将两件事混为一谈:文件注入和外观。

您正在扩展没有 $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.phpdelimiter设置,文件将被正确解析。 为什么使用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();

此页面是否有帮助?
0 / 5 - 0 等级