Laravel 8导入XLSX文件时数据为空问题求助
问题原因与解决办法
核心问题
你同时实现了WithHeadingRow和WithStartRow接口,但在model方法里依然用数字索引($row[0]、$row[1])访问数据,这是矛盾的。
当启用WithHeadingRow时,Laravel Excel会将每行数据转换为关联数组,键对应Excel表头(即你设置的startRow=3那一行的内容),不再保留数字索引。所以用$row[0]自然取不到值。
解决方案
根据你的需求,有两种处理方式:
方式一:移除WithHeadingRow接口
如果你不需要用表头作为数组键,直接用数字索引读取数据,只保留WithStartRow接口即可:
// 修改ImportItem类的实现 class ImportItem implements ToModel, WithStartRow { public function __construct($id_warrent) { $this->id_warrent = $id_warrent; } public function model(array $row) { return new WarrentItemModel([ 'id_warrent_item' => Str::random(5), 'warrent_entry_id' => $this->id_warrent, 'warr_item_category' => $row[0], 'warr_item_code' => $row[1], 'warr_item_nup' => $row[2], 'warr_item_name' => $row[3], 'warr_item_type' => $row[4], 'warr_item_qty' => $row[5], 'warr_item_unit' => $row[6] ]); } public function startRow(): int { return 3; } }
方式二:改用表头键名访问数据
如果你需要保留WithHeadingRow(比如要通过表头名称关联字段),则需要把$row的数字索引换成表头对应的字符串键。假设你Excel第3行的表头是分类、编码、NUP、名称、类型、数量、单位,那么代码修改为:
public function model(array $row) { return new WarrentItemModel([ 'id_warrent_item' => Str::random(5), 'warrent_entry_id' => $this->id_warrent, 'warr_item_category' => $row['分类'], // 替换为你实际的表头名称 'warr_item_code' => $row['编码'], 'warr_item_nup' => $row['NUP'], 'warr_item_name' => $row['名称'], 'warr_item_type' => $row['类型'], 'warr_item_qty' => $row['数量'], 'warr_item_unit' => $row['单位'] ]); }
注意:表头名称要和Excel里的完全一致(包括大小写、空格),或者可以用
WithUppercaseHeadingRow等接口统一格式。
验证建议
修改后可以在model方法里用dd($row)再次确认数组结构,确保键名和你使用的一致。
内容的提问来源于stack exchange,提问作者Muhammad Fahmi
相关产品推荐
相关产品推荐

