从 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。
第一行(标题除外)有 sn
、surname
等的空单元格,而您想要的值实际上在第二(第三)行。
您的第二个问题是您的标题包含 subject
至少 4 次,reader.
将其合并为一个标题
理想情况下,您会重新格式化您的传播sheet。如果可能,将您的标题设为:
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;
如果无法更改跨页格式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 的格式可能完全不适合您要实现的目标。
下面是我要上传的 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。
第一行(标题除外)有 sn
、surname
等的空单元格,而您想要的值实际上在第二(第三)行。
您的第二个问题是您的标题包含 subject
至少 4 次,reader.
理想情况下,您会重新格式化您的传播sheet。如果可能,将您的标题设为:
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;
如果无法更改跨页格式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 的格式可能完全不适合您要实现的目标。