从Excel文件Laravel Excel中读取数据

时间:2018-04-08 21:08:27

标签: excel laravel maatwebsite-excel

下面是我要上传的excel表,我想读取这样的数据:

'sn' => 1,
'surname' => 'amadien',
'fname' => 'Franklyn',
'oname' => null,
'reg_no' => '3030421470HG',
'subject' =>[
            'mathematics' => [5, 12, 64],
            'english_language' => [5, 6, 55],
            'christian_religious_studies' => [6, 13, 48]
            'agricultural_science' => [4, 18, 64]
          ]

代码:

try {
        Excel::load($request->file('result-file'), function ($reader) {

            foreach ($reader->toArray() as $row) {
                dd($row);
                //User::firstOrCreate($row);
            }
        });
        session()->flash('success', 'Users uploaded successfully.');
        return back();
    } catch (\Exception $e) {
        session()->flash('error', $e->getMessage());
        return back();
    }

但到目前为止,我还没有。感谢

Output

Sheet

1 个答案:

答案 0 :(得分:1)

您的第一个数组包含空值的原因是因为Excel阅读器逐行读取您的工作表。

第一行(标题除外)有snsurname等空单元格,而您想要的值实际上位于第二(第三)行。

您的第二个问题是您的标题至少包含subject次4次,而读者会将其合并为一个标题。

理想情况下,您需要重新格式化电子表格。如果可能的话,请标题为:

sn surname fname oname reg_no mathematics english_language(依此类推)。

将您的行设为:

1 surname forename oname 12345 5, 12, 64 5, 6, 55(依此类推)。

请注意我是如何将单个单元格中每个主题的分数组合在一起的,用逗号分隔。

现在你将得到一个与此相似的数组:

'sn' => 1,
'surname' => 'amadien',
'fname' => 'Franklyn',
'oname' => null,
'reg_no' => '3030421470HG',
'mathematics' => '5, 12, 64',
'english_language' => '5, 6, 55',

如果您希望您的主题仍然在嵌套数组中,您可以这样做:

$subjects = array_only($row, ['mathematics', 'english_language', ...]);

foreach ($subjects as $subject => $scores) {
    $subjects[$subject] = explode(',', $scores);
}

$row['subjects'] = $subjects;

如果可以更改电子表格的格式,则需要将两行组合在一起。

假设行总是成对出现,您可以使用array_chunk在一个集合中获取所需的两个数组(每行一个),然后通过构建新数组映射并组合结果。< / p>

例如:

$rows = array_chunk($rows, 2);

array_map(function ($subset) {
    return [
        'sn' => $subset[0]['sn'],
        'surname' => $subset[0]['surname'],
        'fname' => $subset[0]['fname'],
        'subjects' => [
            ...
        ]
    ];
}, $rows);

但是,这很快就会变得混乱。表单的格式可能完全不适合您要实现的目标。