导入带有与数据库字段不同的标头的Excel文档 - Laravel 5.2

时间:2016-03-01 21:24:46

标签: php excel eloquent laravel-5.2 maatwebsite-excel

尝试导入带有自定义标题(即人类可读)的Excel电子表格,并将其与excel导入的数据库字段进行匹配。

示例:列标题为:Region(例如North America)
        数据库列标题为:region_code

知道如何使用maatwebsite/excel包和Eloquent模型执行此操作吗?

1 个答案:

答案 0 :(得分:1)

有几种方法可以解决这个问题。默认情况下,maatwerk-excel包将标头转换为slugs。

  

注意:默认情况下,这些属性将转换为slug。您可以更改config excel :: import.heading中的默认值。可用选项包括:true | false | slugged | ascii | numeric | hashed | trans | original

     

当excel :: import.to_ascii设置为true时,True和slugged也将转换为ASCII。您也可以在配置中更改默认分隔符。

source

您将能够通过slug来处理该行,因此Region将成为region。你可以看看是否有适合你的设置。

循环,映射并保存

复杂性取决于您是否有多张工作表,您可以循环浏览所有内容并将其保存在每个字段的Eloquent模型上,方法是将其映射为Mark Ba​​ker在您的问题评论中提到的。我不知道文件是上传还是你从本地文件系统中获取文件,所以我为我的例子选择了文件系统选项:

Excel::load(storage_path('app/public/excel-import.xlsx'), function($reader) {

    $results = $reader->get();
    foreach($results as $result) {
        // Your model namespace here
        $model = new \App\ImportItem();
        $model->region_code = $result->region;
        $model->numeric_code = $result->code;
        $model->testfield = $result->test_field;
        $model->save();
    }
});

当你有很多带有很多字段的Excel文件时,这并不是很容易维护,但是如果它们很少而且不容易改变,那么它可能是一个解决方案

质量分配

另一个选项是更改Excel中的所有标题(如果这是一个选项),然后Mass Assign您的模型通过将上面显示的foreach的内容替换为:

$model = App\ImportItem::create($result->toArray()); 

请注意,默认情况下,所有Eloquent模型都受到Mass Assignment的保护。查看documentation以查看是否要设置属性fillableguarded(请注意所提到的安全含义)。我注意到有些文件的0 => null数组中有一个字段items要导入某些文件(显然是一个空列),所以你也可以这样称呼它

CellCollection

请注意,它可能会在其他空字段上产生不需要的结果,因此您也可以用其他方式删除它。

现在,如果您不想重命名Excel中的所有列,您也可以在模型中定义mutators,但我认为在这种情况下也不合适。一个例子:

$reader->ignoreEmpty()->get()

也许我一无所知地写了这一切,并且有一个更容易和更快的方式实现到包和/或Laravel本身进行这样的映射,抱歉在这种情况下浪费你的时间。