Laravel中Maatwebsite Excel控制器向多工作表导入传数据报错解决
Laravel中Maatwebsite Excel多工作表导入数据传递报错解决
问题场景
在Laravel框架中使用Maatwebsite Excel导入带多工作表的Excel文件,需要将上传相关的datasubmit数据传递给导入类以关联MySQL中的其他数据,但运行时报错:
Undefined property: App\Imports\TargetSheetImport::$data
直接使用TargetHeaderImport单工作表导入时功能正常,但当前Excel有2个工作表,仅需导入其中一个。
相关代码
控制器代码
public function upload(Request $request){ $file = $request->filebabp; if($file) { $nama_file = Carbon::now()->setTimezone('Asia/Jakarta')->format('Ymd-His').'-'.$file->getClientOriginalName(); $datasubmit['file'] = $file; $datasubmit['upload_date'] = Carbon::now()->setTimezone('Europe/Belarusia')->format('Y-m-d H:i:s'); $datasubmit['nama_file'] = $nama_file; $datasubmit['version'] = 'NEW'; $file->move(public_path('files/'), $nama_file); $upload = Excel::import(new TargetUpload($datasubmit), base_path('public/files/'.$nama_file)); } return $this->sendResponse($file, 'Submit successfully'); }
多工作表导入类代码
use Importable; protected $data; function __construct($data) { $this->data = $data; } public function sheets($data): array { return [ 0 => new TargetHeaderImport($data), ]; }
报错原因与解决方法
核心问题
多工作表导入类的sheets方法错误地使用了方法参数$data,而非构造函数中初始化的类成员变量$this->data。Maatwebsite Excel的sheets方法会自动传入内部工作表数据,并非你在控制器中传递的datasubmit。
修正步骤
- 修改多工作表导入类的
sheets方法,移除方法参数$data,改用类成员变量$this->data:
public function sheets(): array { return [ 0 => new TargetHeaderImport($this->data), ]; }
核对类命名一致性:控制器中实例化的是
TargetUpload,但报错提示的是TargetSheetImport,确认多工作表导入类的类名是否为TargetUpload,避免因类名拼写错误导致属性未定义问题。额外检查:控制器中
$request->filebabp疑似笔误,正确的文件获取方式应为$request->file('babp'),若此处错误会导致文件无法正常获取,需同步修正。
替代方案(若构造函数传递仍有问题)
可临时将datasubmit存入Session,在导入类中取出使用:
- 控制器中添加:
session(['datasubmit' => $datasubmit]);
- 在
TargetHeaderImport中获取:
$datasubmit = session('datasubmit'); // 使用后可清除session session()->forget('datasubmit');
内容的提问来源于stack exchange,提问作者Test Doang
相关产品推荐
相关产品推荐

