从 excel 文件 Laravel Excel 中读取数据

Read data from excel file Laravel Excel

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

'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();
    }

但到目前为止,我还做不到。谢谢

您的第一个数组包含空值的原因是因为 Excel reader 正在逐行读取您的 sheet。

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

您的第二个问题是您的标题包含 subject 至少 4 次,reader.

将其合并为一个标题

理想情况下,您会重新格式化您的传播sheet。如果可能,将您的标题设为:

snsurnamefnameonamereg_nomathematicsenglish_language(依此类推)。

您的行为:

1surnameforenameoname123455, 12, 645, 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;

如果无法更改跨页格式sheet,您需要将两行合并在一起。

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

例如:

$rows = array_chunk($rows, 2);

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

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